Píšem webovú aplikáciu REST (NetBeans 6.9, JAX-RS, TopLink Essentials) a snažím sa vrátiť JSON a stavový kód HTTP. Mám pripravený a funkčný kód, ktorý vracia JSON, keď sa z klienta zavolá metóda HTTP GET. V podstate:
@Path("get/id")
@GET
@Produces("application/json")
public M_機械 getMachineToUpdate(@PathParam("id") String id) {
// some code to return JSON ...
return myJson;
}
Ale chcem tiež vrátiť stavový kód HTTP (500, 200, 204 atď.) spolu s údajmi JSON.
Skúsil som použiť HttpServletResponse
:
response.sendError("error message", 500);
Ale to spôsobilo, že prehliadač si myslel, že ide o "skutočnú" 500, takže výstupná webová stránka bola bežná chybová stránka HTTP 500.
Chcem vrátiť stavový kód HTTP, aby môj JavaScript na strane klienta mohol v závislosti od neho spracovať nejakú logiku (napr. zobraziť kód chyby a správu na stránke HTML). Je to možné, alebo by sa stavové kódy HTTP nemali na takéto veci používať?
Tu je príklad:
@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();
}
Pozrite sa na triedu Response.
Všimnite si, že by ste mali vždy špecifikovať typ obsahu, najmä ak odovzdávate viacero typov obsahu, ale ak bude každá správa reprezentovaná ako JSON, môžete metódu jednoducho anotovať pomocou @Produces("application/json")
JAX-RS má podporu pre štandardné/vlastné kódy HTTP. Pozri napríklad ResponseBuilder a ResponseStatus:
Majte na pamäti, že informácie JSON sa týkajú skôr údajov spojených so zdrojom/aplikáciou. Kódy HTTP sa týkajú skôr stavu požadovanej operácie CRUD. (aspoň tak by to malo byť v systémoch REST)