Estoy usando jQuery's $.getJSON()
para hacer llamadas asincrónicas a mi simple backend Spring MVC. La mayoría de los métodos del controlador Spring se ven así:
@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
@RequestParam("type") String type) {
return someDAO.getSomeData(widget, type);
}
Tengo las cosas configuradas para que cada controlador devuelva el @ResponseBody
como JSON, que es lo que el lado del cliente espera.
Pero, ¿qué sucede cuando se supone que una solicitud no devuelve ningún contenido al lado del cliente? Puedo tener:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
Si no, ¿cuál es la sintaxis adecuada para usar aquí?
java
jquery
spring-mvc
IAmYourFaja
fuente
fuente
POST
datos.Respuestas:
puede devolver void, luego debe marcar el método con @ResponseStatus (value = HttpStatus.OK) no necesita @ResponseBody
Solo los métodos get devuelven una implicidad de código de estado 200, todos los demás que tiene hacen una de tres cosas:
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
HttpEntity
instanciafuente
@ResponseStatus
y no debería. Simplemente tener@ResponseBody
unvoid
controlador es lo suficientemente bueno.Simplemente puede devolver una ResponseEntity con el encabezado apropiado:
fuente
ResponseEntity is a raw type. References to generic type ResponseEntity<T> should be parameterized
Puede devolver el objeto "ResponseEntity". El uso del objeto "ResponseEntity" es muy conveniente tanto al momento de construir el objeto de respuesta (que contiene el cuerpo de respuesta y el código de estado HTTP) como al momento de obtener información del objeto de respuesta.
Métodos como getHeaders (), getBody (), getContentType (), getStatusCode () etc. hacen que el trabajo de leer el objeto ResponseEntity sea muy fácil.
Debe usar el objeto ResponseEntity con un código de estado http de 204 (Sin contenido), que es específicamente para especificar que la solicitud se ha procesado correctamente y que el cuerpo de la respuesta está en blanco intencionalmente. Usar códigos de estado apropiados para transmitir la información correcta es muy importante, especialmente si está creando una API que será utilizada por múltiples aplicaciones cliente.
fuente
@ResponseStatus(HttpStatus.NO_CONTENT)
resueltaXML Parsing Error: no root element found
para mí en el navegadorSí, puede usar @ResponseBody con el
void
tipo de retorno:fuente
No hay nada de malo en devolver un vacío
@ResponseBody
y debePOST
solicitarlo.Use códigos de estado HTTP para definir errores dentro de las rutinas del controlador de excepciones, ya que otros mencionan el estado de éxito. Un método normal como el que tiene devolverá un código de respuesta
200
que es lo que desea, cualquier controlador de excepciones puede devolver un objeto de error y un código diferente (es decir500
).fuente
Pero a medida que su sistema crece en tamaño y funcionalidad ... creo que devolver siempre un json no es una mala idea. Es más una cuestión arquitectónica / "diseño a gran escala".
Puede pensar en recuperar siempre un JSON con dos campos conocidos: código y datos. Donde el código es un código numérico que especifica el éxito de la operación a realizar y los datos son cualquier dato adicional relacionado con la operación / servicio solicitado.
Vamos, cuando usamos un proveedor de servicios backend, cualquier servicio se puede verificar para ver si funcionó bien.
Así que me quedo, para no dejar que Spring administre esto, exponiendo las operaciones de retorno híbridas (Algunos devuelven datos, otros nada ...). Instaed asegúrese de que su servidor exponga una interfaz más homogénea. Es más simple al final del día.
fuente
Aquí hay un código de ejemplo de lo que hice para un método asincrónico
No necesita devolver nada de su método, todo lo que necesita para usar esta anotación es que su método debe devolver OK en todos los casos
fuente