为什么 return 中的 http 请求需要 return 响应对象而不是字符串对象?

why is it necessary to return a Response object instead of String object to an http request in java?

我将我的 REST 方法定义为 return 字符串数据类型作为对 http 请求的响应。就是这样:

    @Path("/users/{name}/")
    @GET
    @Produces("application/json")
    public String getAllUserMemberships(@PathParam("name") String name) throws Exception{

        String doc = "{\"name\":\""+name+"\",\"message\":\"Logged in\"}";

        return doc;
    }

它工作正常,但有人告诉我宁愿 return 一个 javax.ws.rs.core.Response 对象,如下面的示例代码所示。这也很好用,他说这是响应 HTTP 请求的最佳方式,但他不知道为什么。

    @Path("/users/{name}/")
    @GET
    @Produces("application/json")
    public Response getAllUserMemberships(@PathParam("name") String name) throws Exception{

        String doc = "{\"name\":\""+name+"\",\"message\":\"Logged in\"}";


        return Response.ok(doc, MediaType.APPLICATION_JSON).build();
    }

我的问题是: 当您只能 return 一个字符串时,是否有必要 return 一个 HTTP 请求的响应对象。如果有必要,请告诉我为什么,因为我对哪个适合 HTTP 请求的目的感到两难。 我也担心 Response 对象可能会给我一些我可能无法处理的问题。

Response object 允许您 return http 数据连同您的方法的响应。例如,Response object 可以包含 headers、响应代码和其他 String 不能单独 return 的相关信息。话虽如此,不,没有必要。您的程序应该在 String 下正常运行。但是,使用 Response object.

可能是有益且方便的

当您 return 一个字符串时,您的网络应用程序仍会为任何请求提供 HTTP 响应。指定 Response 对象将为您提供更直接的控制。您的标签应该足以为您的目的配置 Response,所以我认为对于像这样简单的事情,创建您自己的 Response 对象不是 "better."

没有必要。

但许多人更喜欢 return 始终响应 object,因为您 经常 需要控制响应 headers(超出那些设置在注释中)和响应的其他方面,如状态代码。因此,如果您有时 return 一个字符串,有时 return 一个响应,它看起来会很不一致。始终如一地这样做会创建一个清晰的 easy-to-follow 模式。

如果你的应用真的很普通,那没关系;否则,您正在考虑的事实表明风格很重要。

如果您 return 一个简单的字符串,您将无法控制出现错误时发生的情况。 但是,如果您 return 响应 object 您可以 return 正确的 500 错误和错误消息:

try {
    return Response.ok(successResult).build();
} catch(Exception ex) {
    return Response.serverError().entity(fault).build();
    //or
    return Response.status(500).entity(fault).build();
}

正如其他人所说,它使您可以控制 HTTP 响应的其他方面,例如设置一些有用的 headers:

Response response = Response.ok(successResult);

response.getHeaders().put("Access-Control-Allow-Origin", "*");
response.getHeaders().put("Access-Control-Allow-Headers",
        "origin, content-type, accept, authorization");
response.getHeaders().put("Access-Control-Allow-Credentials", "true");
response.getHeaders().put("Access-Control-Allow-Methods",
        "GET, POST, PUT, DELETE, OPTIONS, HEAD");

同时发送一个文件要容易得多:

File fileToSend = getFile();
return Response.ok(fileToSend, "application/zip").build();

所以有很多原因,如果不想做任何特殊的事情,那么简单地 returning object 就足够了,如果你确实想修改 HTTP 响应属性,那么你必须使用响应。