JAX-RS - Как да върнем JSON и HTTP код на състоянието заедно?

Пиша REST уеб приложение (NetBeans 6.9, JAX-RS, TopLink Essentials) и се опитвам да върна JSON и HTTP статус код. Имам готов и работещ код, който връща JSON при извикване на метода HTTP GET от клиента. По същество:

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

    // some code to return JSON ...

    return myJson;
}

Но искам да върна и HTTP статус код (500, 200, 204 и т.н.) заедно с JSON данните.

Опитах се да използвам 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)