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

标签 java json api rest error-reporting

我指的是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/

相关文章:

python - 将 csv 文件发送到 fastAPI 并取回新文件

java - 如何使用 Spring Kafka 实现有状态的消息监听器?

java - maven-bundle-plugin 不包含 Import-Package

javascript - Bootstrap 子菜单 JSON

json - 如何发送 DataContract 对象作为 WCF RESTFUL web 服务的参数?

c - 嵌入式系统的图形API

json - 如何在 Swift 中进行签名 API 调用

java - 如何使用 Java 创建数据流程图

java - 每次收听RSS并实时获取更新的好方法是什么?

用于 List<object> 的 c# JSON.Net NullValueHandling