java - mvc - @RequestBody y @ResponseBody anotaciones en Spring
spring rest ejemplo (4)
A continuación se muestra un ejemplo de un método en un controlador de Java.
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
Al usar la anotación @RequestBody obtendrá sus valores asignados con el modelo que creó en su sistema para manejar cualquier llamada específica. Mientras usa @ResponseBody puede enviar cualquier cosa al lugar desde donde se generó la solicitud. Ambas cosas serán mapeadas fácilmente sin escribir ningún analizador personalizado, etc.
¿Alguien puede explicar las anotaciones @RequestBody
y @ResponseBody
en Spring 3? ¿Para qué son? Cualquier ejemplo sería genial.
Hay una sección completa en los documentos llamados 16.3.3.4 Asignación del cuerpo de la solicitud con la anotación @RequestBody . Y uno llamó a 16.3.3.5 Mapeo del cuerpo de respuesta con la anotación @ResponseBody . Te sugiero que consultes esas secciones. También es relevante: @RequestBody
javadocs, @ResponseBody
javadocs
Los ejemplos de uso serían algo como esto:
Utilizando una biblioteca de JavaScript como JQuery, publicaría un objeto JSON de esta manera:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
Su método de controlador se vería así:
// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}
// domain / value objects
public class UserStats{
private String firstName;
private String lastName;
// + getters, setters
}
public class Description{
private String description;
// + getters, setters, constructor
}
Ahora, si tiene a Jackson en su classpath (y tiene una configuración <mvc:annotation-driven>
), Spring convertiría el JSON entrante en un objeto UserStats del cuerpo de la publicación (porque agregó la anotación @RequestBody
) y serializaría el Objeto devuelto a JSON (porque ha agregado la anotación @ResponseBody
). Entonces, el navegador / cliente vería este resultado JSON:
{ "description" : "Elmer Fudd hates wacky wabbits" }
Vea esta respuesta mía anterior para obtener un ejemplo de trabajo completo: https://.com/a/5908632/342852
Nota: RequestBody / ResponseBody por supuesto no está limitado a JSON, ambos pueden manejar múltiples formatos, incluyendo texto plano y XML, pero JSON es probablemente el formato más utilizado.
Actualización: Desde Spring 4.x, generalmente no @ResponseBody
en el nivel de método, sino más bien @RestController
en el nivel de clase, con el mismo efecto. Consulte Creación de controladores REST con la anotación @RestController
@RequestBody : la anotación que indica un parámetro de método debe vincularse al cuerpo de la solicitud HTTP.
Por ejemplo:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
@ResponseBody anotación @ResponseBody se puede colocar en un método e indica que el tipo de devolución debe escribirse directamente en el cuerpo de respuesta HTTP (y no debe colocarse en un Modelo o interpretarse como un nombre de vista).
Por ejemplo:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public @ResponseBody String helloWorld() {
return "Hello World";
}
Alternativamente, podemos usar la anotación @RestController en lugar de la anotación @Controller
. Esto eliminará la necesidad de usar @ResponseBody
.
package com.programmingfree.springshop.controller;
import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;
@RestController
@RequestMapping("/shop/user")
public class SpringShopController {
UserShop userShop=new UserShop();
@RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
public User getUser(@PathVariable int id) {
User user=userShop.getUserById(id);
return user;
}
@RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
public List<User> getAllUsers() {
List<User> users=userShop.getAllUsers();
return users;
}
}
En el ejemplo anterior, van a mostrar todos los detalles de usuario y de identificación en particular. Ahora quiero usar tanto el id como el nombre.
1) localhost: 8093 / plejson / shop / user <--- este enlace mostrará todos los detalles del usuario
2) localhost: 8093 / plejson / shop / user / 11 <---- si uso 11 en el enlace significa que mostrará los detalles del usuario particular 11
ahora quiero usar tanto el id como el nombre
localhost: 8093 / plejson / shop / user / 11 / raju <----------------- como este significa que podemos usar cualquiera en esto por favor ayúdenme ... .