Birisi Bahar 3'teki açıklamaları @RequestBody
ve @ResponseBody
açıklamaları açıklayabilir mi? Ne için bunlar? Herhangi bir örnek harika olurdu.
Birisi Bahar 3'teki açıklamaları @RequestBody
ve @ResponseBody
açıklamaları açıklayabilir mi? Ne için bunlar? Herhangi bir örnek harika olurdu.
Yanıtlar:
Dokümanlarda 16.3.3.4 İstek gövdesini @RequestBody ek açıklamasıyla eşleme adlı bir bölüm var . Ve biri 16.3.3.5 Yanıt gövdesini @ResponseBody ek açıklamasıyla eşleme olarak adlandırdı . Bu bölümlere bakmanızı öneririm. Ayrıca ilgili: @RequestBody
javadoklar, @ResponseBody
javadoklar
Kullanım örnekleri şöyle olacaktır:
JQuery gibi bir JavaScript kitaplığı kullanarak, aşağıdaki gibi bir JSON Nesnesi gönderirsiniz:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
Denetleyici yönteminiz şöyle görünür:
// 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
}
Şimdi sınıf yolunuzda Jackson varsa (ve bir <mvc:annotation-driven>
kurulumunuz varsa), Spring gelen JSON'u yazı gövdesinden bir UserStats nesnesine dönüştürür ( @RequestBody
ek açıklamayı eklediğiniz için ) ve döndürülen nesneyi JSON'a serileştirir ( @ResponseBody
açıklama). Tarayıcı / İstemci bu JSON sonucunu görür:
{ "description" : "Elmer Fudd hates wacky wabbits" }
Tam bir çalışma örneğin benim bu cevaba bakınız: https://stackoverflow.com/a/5908632/342852
Not: RequestBody / ResponseBody elbette JSON ile sınırlı değildir, her ikisi de düz metin ve XML de dahil olmak üzere birden çok biçimi işleyebilir, ancak JSON muhtemelen en çok kullanılan biçimdir.
İlkbahar 4.x'ten bu yana, genellikle @ResponseBody
yöntem düzeyinde değil @RestController
, aynı etkiyle sınıf düzeyinde kullanacaksınız .
Resmi Spring MVC belgelerinden bir alıntı :
@RestController
a, oluşan açıklama kendisi açıklamalı Meta ile@Controller
ve@ResponseBody
olan her metot, tip seviye devralan bir kontrolör belirtmek için@ResponseBody
ek açıklama ve bu nedenle, görüş çözünürlüğe karşı yanıt gövdesi doğrudan yazar ve bir HTML şablonu ile işleme.
@RequestBody
parametre @ResponseBody
üzerinde, yöntem üzerinde. önemli fark!
@ResponseBody
. Az önce söylediğin gibi, @RequestBody
parametreye devam ediyor değil mi? Ancak yukarıdaki cevapta, yöntem üzerinde var.
@RequestBody
aslında hala gerekli, @ResponseBody
kullanırken örtük @RestController
. Pls cevabınızı düzeltin, yanlış olmak için çok fazla upvotes var!
@RestController
ve tanıtıldığında değiştirildi
@RequestBody : Bir yöntem parametresini gösteren ek açıklama HTTP isteğinin gövdesine bağlanmalıdır.
Örneğin:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
@ResponseBody ek açıklaması bir yönteme konabilir ve dönüş türünün doğrudan HTTP yanıt gövdesine yazılması gerektiğini (ve bir Model içine yerleştirilmemesi veya görünüm adı olarak yorumlanması gerektiğini) belirtir.
Örneğin:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public @ResponseBody String helloWorld() {
return "Hello World";
}
Alternatif olarak, ek açıklama yerine @RestController ek açıklamasını kullanabiliriz @Controller
. Bu, kullanma ihtiyacını ortadan kaldıracaktır @ResponseBody
.
Aşağıda, Java denetleyicisinde bir yönteme örnek verilmiştir.
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
@RequestBody ek açıklamasını kullanarak, belirli bir çağrıyı yönetmek için değerlerinizi sisteminizde oluşturduğunuz modelle eşleştireceksiniz. @ResponseBody öğesini kullanarak, isteğin oluşturulduğu yere herhangi bir şey gönderebilirsiniz. Her iki şey de özel ayrıştırıcı yazmadan kolayca eşleştirilecektir.
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;
}
}
Yukarıdaki örnekte tüm kullanıcı ve belirli kimlik ayrıntılarını görüntüleyecekler, şimdi hem id hem de ad kullanmak istiyorum,
1) localhost: 8093 / plejson / mağaza / kullanıcı <--- bu bağlantı tüm kullanıcı ayrıntılarını gösterecektir
2) localhost: 8093 / plejson / mağaza / kullanıcı / 11 <---- 11 bağlantı anlamına gelirse, belirli kullanıcı 11 ayrıntılarını göster
şimdi hem kimliği hem de adı kullanmak istiyorum
localhost: 8093 / plejson / mağaza / kullanıcı / 11 / raju <----------------- bunun gibi herhangi birini kullanabilirsiniz anlamına gelir lütfen bana yardım .... .
@ResponseBody
yöntemi değil parametreyi ek açıklama kullandınız . Yönteme koymaya çalışırken hata alıyorum, bu yüzden diğer cevabınızın doğru olduğunu varsayıyorum. BencegetDescription(@RequestBody UserStats stats)
yukarıda olmalı .