JAX-RS - Kako vrniti JSON in kodo stanja HTTP skupaj?

Pišem spletno aplikacijo REST (NetBeans 6.9, JAX-RS, TopLink Essentials) in poskušam vrniti kodo stanja JSON in HTTP. Pripravljena in delujoča koda vrača JSON, ko odjemalec pokliče metodo HTTP GET. V bistvu:

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

    // some code to return JSON ...

    return myJson;
}

Vendar želim vrniti tudi kodo stanja HTTP (500, 200, 204 itd.) skupaj s podatki JSON.

Poskušal sem uporabiti HttpServletResponse:

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

Vendar je brskalnik zaradi tega mislil, da gre za "pravo" 500, zato je bila izhodna spletna stran običajna stran z napako HTTP 500.

Želim vrniti kodo stanja HTTP, da lahko moj JavaScript na strani odjemalca izvede nekaj logičnih postopkov, ki so odvisni od nje (npr. prikaže kodo napake in sporočilo na strani HTML). Ali je to mogoče ali se kode stanja HTTP ne smejo uporabljati za take stvari?

Rešitev

Tukaj je primer:

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

Oglejte si razred Response.

Upoštevajte, da morate vedno navesti vrsto vsebine, zlasti če posredujete več vrst vsebine, če pa bo vsako sporočilo predstavljeno kot JSON, lahko metodo samo anotirate z @Produces("application/json")

Komentarji (4)

JAX-RS ima podporo za standardne/prilagojene kode HTTP. Oglejte si na primer ResponseBuilder in 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

Upoštevajte, da so informacije JSON bolj povezane s podatki, povezanimi z virom/aplikacijo. Kode HTTP so bolj povezane s stanjem zahtevane operacije CRUD. (vsaj tako naj bi bilo v sistemih REST).

Komentarji (1)

Ne uporabljam JAX-RS, vendar imam podoben scenarij, kjer uporabljam:

response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
Komentarji (2)