spring @RequestBody और @RequestParam के बीच क्या अंतर है?




spring-mvc spring-boot (4)

मैं @RequestBody बारे में जानने के लिए स्प्रिंग प्रलेखन के माध्यम से गया हूं, और उन्होंने निम्नलिखित स्पष्टीकरण दिया है:

@RequestBody विधि पैरामीटर एनोटेशन इंगित करता है कि एक विधि पैरामीटर HTTP अनुरोध निकाय के मान से बाध्य होना चाहिए। उदाहरण के लिए:

@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
  writer.write(body);
}

आप HttpMessageConverter का उपयोग कर अनुरोध निकाय को विधि तर्क में कनवर्ट करते हैं। HttpMessageConverter HTTP अनुरोध संदेश से किसी ऑब्जेक्ट में कनवर्ट करने और किसी ऑब्जेक्ट से HTTP प्रतिक्रिया निकाय में कनवर्ट करने के लिए ज़िम्मेदार है।

DispatcherServlet DefaultAnnotationHandlerMapping और AnnotationMethodHandlerAdapter DefaultAnnotationHandlerMapping का उपयोग करके एनोटेशन आधारित प्रसंस्करण का समर्थन करता है। स्प्रिंग 3.0 में AnnotationMethodHandlerAdapter को @RequestBody का समर्थन करने के लिए बढ़ाया गया है और निम्न HttpMessageConverter डिफ़ॉल्ट रूप से पंजीकृत है:

...

लेकिन मेरा भ्रम वह वाक्य है जो उन्होंने डॉक्टर में लिखा है

@RequestBody विधि पैरामीटर एनोटेशन इंगित करता है कि एक विधि पैरामीटर HTTP अनुरोध निकाय के मान से बाध्य होना चाहिए।

इसका मतलब क्या है? क्या कोई मुझे एक उदाहरण प्रदान कर सकता है?

वसंत डॉक्टर में @RequestParam परिभाषा है

एनोटेशन जो इंगित करता है कि एक विधि पैरामीटर वेब अनुरोध पैरामीटर से बाध्य होना चाहिए। Servlet और Portlet वातावरण में एनोटेटेड हैंडलर विधियों के लिए समर्थित।

मैं उनके बीच भ्रमित हो गया हूँ। कृपया, मुझे एक उदाहरण के साथ मदद करें कि वे एक-दूसरे से अलग कैसे हैं।


@RequestParam एनोटेटेड पैरामीटर विशिष्ट सर्वलेट अनुरोध पैरामीटर से जुड़े होते हैं। पैरामीटर मान घोषित विधि तर्क प्रकार में परिवर्तित हो जाते हैं। यह एनोटेशन इंगित करता है कि एक विधि पैरामीटर वेब अनुरोध पैरामीटर से बाध्य होना चाहिए।

उदाहरण के लिए वसंत अनुरोध पैराम के लिए कोणीय अनुरोध इस तरह दिखेगा:

$http.post('http://localhost:7777/scan/l/register?username="Johny"&password="123123"&auth=true')
      .success(function (data, status, headers, config) {
                        ...
                    })

RequestParam के साथ एंडपॉइंट:

@RequestMapping(method = RequestMethod.POST, value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestParam String username,
                                    @RequestParam String password,
                                    @RequestParam boolean auth,
                                    HttpServletRequest httpServletRequest) {...

@RequestBody एनोटेटेड पैरामीटर HTTP अनुरोध निकाय से जुड़े होते हैं। पैरामीटर मान HttpMessageConverters का उपयोग कर घोषित विधि तर्क प्रकार में परिवर्तित हो जाते हैं। यह एनोटेशन इंगित करता है कि एक विधि पैरामीटर वेब अनुरोध के शरीर से बंधे होना चाहिए।

उदाहरण के लिए स्प्रिंग अनुरोधबॉडी के लिए कोणीय अनुरोध इस तरह दिखेगा:

$scope.user = {
            username: "foo",
            auth: true,
            password: "bar"
        };    
$http.post('http://localhost:7777/scan/l/register', $scope.user).
                        success(function (data, status, headers, config) {
                            ...
                        })

RequestBody के साथ एंडपॉइंट:

@RequestMapping(method = RequestMethod.POST, produces = "application/json", 
                value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestBody User user,
                                    HttpServletRequest httpServletRequest) {... 

उम्मीद है की यह मदद करेगा।


@RequestParam स्प्रिंग को आपके विधि तर्क में GET / POST अनुरोध से अनुरोध पैरामीटर मैप करने के लिए बनाता है।

अनुरोध प्राप्त करें

http://testwebaddress.com/getInformation.do?city=Sydney&country=Australia

public String getCountryFactors(@RequestParam(value = "city") String city, 
                    @RequestParam(value = "country") String country){ }

पोस्ट अनुरोध

@RequestBody स्प्रिंग को मॉडल अनुरोध के लिए पूरे अनुरोध को मानचित्र बनाने के लिए बनाता है और वहां से आप अपने गेटर और सेटर विधियों से मूल्यों को पुनर्प्राप्त या सेट कर सकते हैं। नीचे जांचें।

http://testwebaddress.com/getInformation.do

आपके पास JSON डेटा है जो इस तरह के सामने से आ रहा है और आपके कंट्रोलर क्लास को हिट करता है

{
   "city": "Sydney",
   "country": "Australia"
}

Java कोड - बैकएंड ( @RequestBody )

public String getCountryFactors(@RequestBody Country countryFacts)
    {
        countryFacts.getCity();
        countryFacts.getCountry();
    }


public class Country {

    private String city;
    private String country;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}

यहां @RequestBody के साथ एक उदाहरण है, नियंत्रक पर पहली बार देखो !!

  public ResponseEntity<Void> postNewProductDto(@RequestBody NewProductDto newProductDto) {

   ...
        productService.registerProductDto(newProductDto);
        return new ResponseEntity<>(HttpStatus.CREATED);
   ....

}

और यहां कोणीय नियंत्रक है

function postNewProductDto() {
                var url = "/admin/products/newItem";
                $http.post(url, vm.newProductDto).then(function () {
                            //other things go here...
                            vm.newProductMessage = "Product successful registered";
                        }
                        ,
                        function (errResponse) {
                            //handling errors ....
                        }
                );
            }

और फॉर्म पर एक छोटा सा देखो

 <label>Name: </label>
 <input ng-model="vm.newProductDto.name" />

<label>Price </label> 
 <input ng-model="vm.newProductDto.price"/>

 <label>Quantity </label>
  <input ng-model="vm.newProductDto.quantity"/>

 <label>Image </label>
 <input ng-model="vm.newProductDto.photo"/>

 <Button ng-click="vm.postNewProductDto()" >Insert Item</Button>

 <label > {{vm.newProductMessage}} </label>

@RequestParam एनोटेशन स्प्रिंग को बताता है कि इसे आपके विधि तर्क में GET / POST अनुरोध से अनुरोध पैरामीटर को मानचित्र बनाना चाहिए। उदाहरण के लिए:

निवेदन:

GET: http://someserver.org/path?name=John&surname=Smith

एंडपॉइंट कोड:

public User getUser(@RequestParam(value = "name") String name, 
                    @RequestParam(value = "surname") String surname){ 
    ...  
    }

तो मूल रूप से, जबकि @RequestBody पूरे उपयोगकर्ता अनुरोध (यहां तक ​​कि POST के लिए) स्ट्रिंग वैरिएबल पर नक्शा करता है, @RequestParam आपके विधि तर्क के लिए एक (या अधिक - लेकिन यह अधिक जटिल है) अनुरोध करता है।







http-request-parameters