如何从RESTful API正确传递错误?

时间:2016-07-06 14:06:49

标签: java json api rest error-reporting

我指的是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数据。

谢谢!

3 个答案:

答案 0 :(得分:3)

RESTful服务基于两件事,响应代码和实际响应本身。

好吧,基本上它归结为你想要处理的错误。此特定方案意味着未找到任何数据,您将找到处理此方案的不同方法。任何其他错误条件将以不同方式处理

处理此错误的两种方法是

场景1:

响应代码:200 OK
 回复:{}

表示没有指定请求的数据(更多是请求提供的参数)

场景2:

回应代码:404未找到
 回复:{“错误”:“错误消息”}

但这可能会让人感到困惑,表明找不到该服务。但这取决于您如何定义RESTful API。

根据我的理解,上面的场景是两者的混合,它发出200 OK,但同时也是错误信息,而不是这样做。

最好阅读REST规则,然后提出您的API。

同样值得通过SWAGGER或RAML记录您的API,这对于使用该服务的人来说非常有意义,而无需通过大量的代码来理解它。

答案 1 :(得分:2)

由于您正在使用http,因此您应该正确使用http status codes,例如,SQL异常可能会导致响应代码为500 Internal Server Error,但您不应该公开实际的堆栈跟踪或异常至少有两个原因

  1. api-user没有使用该错误消息,他无法采取行动或采取任何合理的措施来解决它。
  2. 您正在暴露应用程序内部,这可能会为某人提供有价值信息的恶意目的。
  3. 实际显示错误时。希望用户可以使用某种东西。你可以以任何你认为适合你的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" }