20

मैं @RequestBody के बारे में पता करने के लिए स्प्रिंग प्रलेखन माध्यम से चले गए, और वे निम्नलिखित विवरण दे दिया है:@RequestBody और @RequestParam के बीच क्या अंतर है?

@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 प्रतिक्रिया शरीर के लिए परिवर्तित करने के लिए जिम्मेदार है।

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

...

लेकिन मेरी भ्रम की सजा वे दस्तावेज़ में लिखा है कि है

है

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

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

वसंत दस्तावेज़ में @RequestParam परिभाषा

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

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

+0

(http [वसंत के @RequestBody और @RequestParam सीखने] के संभावित डुप्लिकेट पर एक छोटी नज़र है। कॉम/प्रश्न/3337350/सीखने-स्प्रिंग्स-अनुरोधकर्ता-और-अनुरोधकर्ता) – kryger

+0

@ क्रिएगर। यह डुप्लिकेट नहीं है, क्योंकि मेरे पास मेरा शोध है, मैं वसंत डॉक्टर के माध्यम से चला गया हूं। मैंने उदाहरण के लिए कहा है। मैंने आपको परिभाषा दी है। मुझे उदाहरण चाहिए कि उनके बीच क्या अंतर है। उपर्युक्त प्रश्न ने उस पर पर्याप्त स्पष्टीकरण नहीं दिया है, इसलिए मुझे नहीं लगता कि इसे वोट दिया जाना चाहिए। –

उत्तर

31

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

स्प्रिंग RequestParam (रों) के लिए उदाहरण के कोणीय अनुरोध है कि कैसा दिखेगा के लिए: RequestParam साथ

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

Endpoint:

@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 का उपयोग कर घोषित विधि तर्क प्रकार में परिवर्तित हो जाते हैं। यह एनोटेशन इंगित करता है कि एक विधि पैरामीटर वेब अनुरोध के शरीर से बंधे होना चाहिए। RequestBody साथ

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

Endpoint:

उदाहरण के लिए स्प्रिंग RequestBody के लिए कोणीय अनुरोध है कि कैसा दिखेगा

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

आशा इस मदद करता है।

+0

मुझे लगता है कि यह उत्तर स्वीकार कर लिया गया है, इसके लिए 'अप' वोट भी हैं। लेकिन @RequestParam के लिए पहला कोणीय उदाहरण सही है? – 112g

+0

आपको क्या लगता है कि यह सही नहीं है? –

+0

यह जेसन अनुरोध का उत्पादन करेगा। '@RequestParam स्ट्रिंग उपयोगकर्ता नाम 'इंगित करता है कि उपयोगकर्ता नाम वेब अनुरोध का पैरामीटर होना चाहिए। – 112g

1

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

अनुरोध:

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

endpoint कोड:

public User getUser(@RequestParam(value = "name") String name, 
        @RequestParam(value = "surname") String surname){ 
    ... 
    } 
तो मूल रूप से

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

+2

कृपया उदाहरण के लिए उदाहरण दें। @ RequestBody –

0

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

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> 
संबंधित मुद्दे