【问题标题】:why is it necessary to return a Response object instead of String object to an http request in java?java中的http请求为什么需要返回一个Response对象而不是String对象?
【发布时间】:2016-07-28 15:31:02
【问题描述】:

我定义了我的 REST 方法来返回一个字符串数据类型作为对 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;
    }

它工作正常,但有人告诉我宁愿返回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();
    }

我的问题是:当您可以只返回一个字符串时,是否有必要向 HTTP 请求返回一个响应对象。如果有必要,请告诉我为什么,因为对于 HTTP 请求的目的,哪个是正确的,我进退两难。 我还担心 Response 对象可能会给我带来一些我可能无法处理的问题。

【问题讨论】:

  • 这是为了方便。您可能想要设置一堆标题。您可能想要控制状态代码。 Response 让你做到这一点。 String(单独)没有。

标签: java rest jersey jetty embedded-jetty


【解决方案1】:

如果您返回一个简单的字符串,您将无法控制发生错误时会发生什么。 但是如果你返回 Response 对象,你可以返回一个正确的 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 响应的其他方面,例如设置一些有用的标头:

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();

所以有很多原因,如果不想做任何特别的事情,那么简单地返回对象就足够了,如果你想修改 HTTP 响应属性,那么你必须使用 Response。

【讨论】:

    【解决方案2】:

    没必要。

    但是很多人更喜欢总是返回一个 Response 对象,因为您经常需要控制响应标头(除了那些在注释中设置的)和响应的其他方面,例如状态码。所以如果你有时返回一个字符串,有时返回一个响应,它看起来会很不一致。始终如一地这样做会创建一个清晰且易于遵循的模式。

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

    【讨论】:

      【解决方案3】:

      Response 对象允许您返回 http 数据以及方法的响应。例如,Response 对象可以包含 String 无法自行返回的标头、响应代码和其他相关信息。话虽如此,不,没有必要。您的程序应该使用String 正常运行。但是,使用 Response 对象可能是有益且方便的。

      【讨论】:

        【解决方案4】:

        当您返回字符串时,您的 Web 应用程序仍会为任何请求提供 HTTP 响应。指定 Response 对象将为您提供更直接的控制。您的标签应该足以为您的目的配置 Response,所以我认为对于这样简单的事情,创建自己的 Response 对象并不是“更好”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-29
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多