为什么有必要将一个Response对象而不是String对象返回给java中的http请求?

时间:2016-07-28 15:31:02

标签: java rest jersey jetty embedded-jetty

我将REST方法定义为返回String数据类型作为对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();
    }

我的问题是:当你可以返回一个字符串时,是否有必要将Response对象返回给HTTP请求。如果有必要,请告诉我为什么因为对于HTTP请求而言哪一个是正确的。 我也担心Response对象可能会给我一些我可能无法处理的问题。

4 个答案:

答案 0 :(得分:9)

如果返回一个简单的String,则无法控制出错的情况。 但是,如果返回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。

答案 1 :(得分:4)

没有必要。

但是很多人更喜欢总是返回一个Response对象,因为经常需要控制响应头(超出注释中设置的那些)和响应的其他方面,比如状态代码。因此,如果您有时返回一个String,有时会返回一个Response,那么它看起来会非常不一致。始终如一地创建一个清晰易懂的模式。

如果您的应用真的很小,那么它并不重要;否则,你正在考虑它的事实表明风格很重要。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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