提问人:jeffery_the_wind 提问时间:7/6/2016 最后编辑:jeffery_the_wind 更新时间:7/6/2016 访问量:3069
如何从 RESTful API 正确传递错误?
How to correctly deliver errors from a RESTful API?
问:
我指的是 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 传递给用户。我发现这对开发非常方便。我知道,如果服务器响应包含该属性,则会出现错误,并且它提供了错误消息。我通过代码审查听说这根本不是这样做的方法。我还怀疑也许你应该给出正式的 HTTP 错误或其他东西。但与此同时,我想我希望我的 api 始终返回漂亮的 JSON 格式字符串。error
当用户尚未进行身份验证时,他们将看到以下内容:
{“error”:“请进行身份验证。
我在数据库连接类中创建了一个错误,用户会看到以下内容:
{“error”:“出现错误:java.sql.SQLException:无法加载 JDBC 驱动程序类 'org.postgresql.Drive'“}
因此,我的问题归结为,使用 RESTful API 向用户返回错误消息的正确方法是什么。其中一种使用返回 JSON 数据。
谢谢!
答:
RESTful 服务基于两件事,响应代码和实际响应本身。
好吧,基本上它归结为您要处理的错误。此特定方案意味着找不到任何数据,您将找到处理此方案的不同方法。任何其他错误情况的处理方式都不同
处理此错误的两种方法是
场景 1:
响应代码:200 OK
响应:{}
这意味着没有指定请求的数据(更何况是随请求提供的参数)
场景 2:
响应代码:404 未找到
响应:{“error”:“错误消息”}
但这可能会造成混淆,以表明未找到该服务。但这取决于你如何定义 RESTful API。
据我了解,上述情况是两者的混合,它发出 200 OK,但同时也发出错误消息,这不是这样做的方法。
最好通读 REST 的规则,然后拿出你的 API。
此外,可能值得通过 SWAGGER 或 RAML 记录您的 API,这使得它对使用该服务的人来说很有意义,而无需通过大量代码来理解它。
评论
meta
code
由于您使用的是 http,因此您应该正确使用 http 状态代码,例如 SQL 异常可能会导致响应代码 ,但您不应该公开实际的堆栈跟踪或异常,至少出于两个原因500 Internal Server Error
- api-user 无法使用该错误消息,他无法对它采取行动或采取任何合理的措施来修复它。
- 您正在公开应用程序内部,这可能会为具有恶意意图的人提供有价值的信息。
当涉及到实际显示错误时。希望用户可以有某种用途。你几乎可以用任何你认为适合你的api的方式来做到这一点。重要的是 api 是一致的。
我想说的是,您现在给出的响应的主体是可以的,除了当您只是调用时,实际消息可能对目标用户没有任何意义,该信息是为开发人员准备的,并且可能应该被记录下来。toString()
Exception
您需要做的是,将异常转换为可用的错误消息并使用 http 状态代码。
在 HTTP 协议之上创建 REST API 时,HTTP 状态代码是指示操作结果的正确方式。除了状态代码外,您还可以返回一条消息,其中包含有关错误的更多详细信息。
在下面找到客户端似乎出错时最常见的错误状态代码:
不要定义自己的状态代码。坚持标准。
返回消息时,HTTP 响应可以如下所示:
HTTP/1.1 404 Not Found
Content-Type: application/json
{ "error" : "Resource not found with the requested identifier" }
评论
meta
code
404 Not Found
404
200 OK
404
halt(401, "{\"error\":\"Please Authenticate.\"}");
200 OK
404 Not Found
200 OK
403 Forbidden
4xx
评论