我指的是this project on Github 。所以这应该是一个用于管理电影租赁服务的 RESTful API。我的意思是它现在在技术上“有效”,但它要做的事情之一就是从内部方法将错误消息直接传递给客户端。
以这段代码为例:
/*
GET films
*/
get("/films", (req, res) -> {
try {
String json_output = get_film_list();
return json_output;
} catch (Exception e) {
return "{\"error\":\"There was an error: " + e.toString().replace("\"","") + "\"}";
}
});
我们有 get_film_list()
方法:
public static String get_film_list() throws SQLException, URISyntaxException{
Connection connection = ConnectionPool.getDBCP2Connection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM films");
String output = "{\"films\":[";
int got_result = 0;
while (rs.next()) {
output += "{\"id\":\""+rs.getInt(1)+"\",\"name\":\""+rs.getString(2)+"\",\"type\":\""+rs.getInt(3)+"\"},";
got_result = 1;
}
rs.close();
stmt.close();
output = output.substring(0, output.length()-1) + "]}";
if (got_result == 1){
return output;
}else{
throw new SQLException("No films.");
}
}
因此错误会通过 API 传递给用户。我发现这对于开发来说非常方便。我知道如果服务器响应包含 error
属性,那么就会出现错误,并且它会提供错误消息。我通过代码审查听说这根本不是这样做的方法。我还怀疑也许你应该给出正式的 HTTP 错误或其他东西。但同时我想我希望我的 api 始终返回漂亮的 JSON 格式的字符串。
当用户尚未进行身份验证时,他们将看到以下内容:
{"error":"Please Authenticate."}
我在数据库连接类中创建了一个错误,用户将看到以下内容:
{"error":"There was an error: java.sql.SQLException: Cannot load JDBC driver class 'org.postgresql.Drive'"}
所以,我的问题归结为,使用 RESTful API 将错误消息返回给用户的正确方法是什么。其中一种使用返回 JSON 数据。
谢谢!
最佳答案
RESTful 服务基于两件事:响应代码和实际响应本身。
嗯,基本上可以归结为您要处理的错误。这种特殊情况意味着找不到数据,您会找到处理这种情况的不同方法。任何其他错误情况都会以不同的方式处理
处理此错误的两种方法是
场景 1:
响应代码:200 OK
响应:{}
这意味着指定的请求没有数据(更重要的是请求提供的参数)
场景 2:
响应代码:404 未找到
响应:{“error”:“错误消息”}
但这可能会造成混淆,表明未找到该服务。但这取决于您如何定义 RESTful API。
据我了解,上述场景是两者的混合,它发出 200 OK,但同时也发出错误消息,这不是执行此操作的方法。
最好通读 REST 规则,然后提出您的 API。
此外,通过 SWAGGER 或 RAML 记录您的 API 可能是值得的,这对于使用该服务的人来说很有意义,而无需通过大量代码来理解它。
关于java - 如何正确地从 RESTful API 传递错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226076/