我指的是this project on Github。因此,这应该是用于管理电影租赁服务的RESTful API。我的意思是技术上和#34;工作"现在,但其中一件事就是从内部方法直接将错误消息传递给客户端。
以此代码为例:
/*
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格式字符串。
当用户未经过身份验证时,他们会看到:
{"错误":"请进行身份验证。"}
我在数据库连接类中创建了一个错误,用户会看到:
{"错误":"出现错误:java.sql.SQLException:无法加载JDBC 司机班' org.postgresql.Drive'"}
所以,我的问题归结为,使用RESTful API将错误消息返回给用户的正确方法是什么。其中一种使用返回JSON数据。
谢谢!
答案 0 :(得分:3)
RESTful服务基于两件事,响应代码和实际响应本身。
好吧,基本上它归结为你想要处理的错误。此特定方案意味着未找到任何数据,您将找到处理此方案的不同方法。任何其他错误条件将以不同方式处理
处理此错误的两种方法是
响应代码:200 OK
回复:{}
表示没有指定请求的数据(更多是请求提供的参数)
回应代码:404未找到
回复:{“错误”:“错误消息”}
但这可能会让人感到困惑,表明找不到该服务。但这取决于您如何定义RESTful API。
根据我的理解,上面的场景是两者的混合,它发出200 OK,但同时也是错误信息,而不是这样做。
最好阅读REST规则,然后提出您的API。
同样值得通过SWAGGER或RAML记录您的API,这对于使用该服务的人来说非常有意义,而无需通过大量的代码来理解它。
答案 1 :(得分:2)
由于您正在使用http,因此您应该正确使用http status codes,例如,SQL异常可能会导致响应代码为500 Internal Server Error
,但您不应该公开实际的堆栈跟踪或异常至少有两个原因
实际显示错误时。希望用户可以使用某种东西。你可以以任何你认为适合你的api的方式做到这一点。重要的是api是一致的。
我说你现在给出的回复正文是可以的,除非事实上当你打电话时,实际的消息可能对预期的用户没有任何意义。在toString()
上{1}},该信息是供开发人员使用的,应该记录下来。
您需要做的是,将例外转换为可用的错误消息并使用http状态代码。
答案 2 :(得分:2)
在HTTP协议的顶部创建REST API时,HTTP状态代码是指示操作结果的正确方法。除状态代码外,您还可以返回包含错误详细信息的消息。
在客户端似乎错误的情况下,查找以下最常见的错误状态代码:
不要定义自己的状态代码。坚持标准。
返回消息时,您的HTTP响应可能如下:
HTTP/1.1 404 Not Found
Content-Type: application/json
{ "error" : "Resource not found with the requested identifier" }