JAX-RS - 如何同时返回JSON和HTTP状态代码?

我正在写一个REST网络应用(NetBeans 6.9, JAX-RS, TopLink Essentials),并试图返回JSON ***和HTTP状态代码。我已经准备好了代码,可以在客户端调用HTTP GET方法时返回JSON。本质上。

@Path("get/id")
@GET
@Produces("application/json")
public M_機械 getMachineToUpdate(@PathParam("id") String id) {

    // some code to return JSON ...

    return myJson;
}

但我*也想在返回JSON数据的同时返回一个HTTP状态代码(500、200、204等)。

我试图使用HttpServletResponse

response.sendError("error message", 500);

但这让浏览器认为这是一个"真正的"500,所以输出的网页是一个普通的HTTP 500错误页面。

我想返回一个HTTP状态代码,这样我的客户端JavaScript就可以根据它来处理一些逻辑(例如在HTML页面上显示错误代码和信息)。这可能吗?或者HTTP状态码不应该被用于这种事情?

解决办法

这里有一个例子。

@GET
@Path("retrieve/{uuid}")
public Response retrieveSomething(@PathParam("uuid") String uuid) {
    if(uuid == null || uuid.trim().length() == 0) {
        return Response.serverError().entity("UUID cannot be blank").build();
    }
    Entity entity = service.getById(uuid);
    if(entity == null) {
        return Response.status(Response.Status.NOT_FOUND).entity("Entity not found for UUID: " + uuid).build();
    }
    String json = //convert entity to json
    return Response.ok(json, MediaType.APPLICATION_JSON).build();
}

看一下Response类。

注意,你应该总是指定一个内容类型,特别是当你传递多种内容类型时,但如果每条消息都将以JSON表示,你可以只用@Produces("application/json")来注释这个方法。

评论(4)

JAX-RS 支持标准/自定义 HTTP 代码。 例如,请参见 ResponseBuilder 和 ResponseStatus。

http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/core/Response.ResponseBuilder.html#status%28javax.ws.rs.core.Response.Status%29

请记住,JSON信息更多的是关于与资源/应用相关的数据。 HTTP代码更多的是关于被请求的CRUD操作的状态。 (至少在REST系统中应该是这样的)

评论(1)

我没有使用JAX-RS,但我有一个类似的场景,我使用。

response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
评论(2)