@RequestParam बनाम @PathVariable


353

विशेष पात्रों को संभालने के दौरान @RequestParamऔर अंतर क्या है @PathVariable?

+@RequestParamअंतरिक्ष के रूप में स्वीकार किया गया था ।

के मामले में @PathVariable, +के रूप में स्वीकार कर लिया गया +

जवाबों:


497

यदि http://localhost:8080/MyApp/user/1234/invoices?date=12-05-20135 दिसंबर, 2013 को उपयोगकर्ता 1234 के लिए URL प्राप्त करता है, तो नियंत्रक विधि इस प्रकार दिखाई देगी:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

इसके अलावा, अनुरोध पैरामीटर वैकल्पिक हो सकते हैं, और स्प्रिंग 4.3.3 पथ चर भी वैकल्पिक हो सकते हैं । हालांकि सावधान रहें, यह URL पथ पदानुक्रम को बदल सकता है और अनुरोध मानचित्रण संघर्षों को प्रस्तुत कर सकता है। उदाहरण के लिए, क्या /user/invoicesउपयोगकर्ता के लिए इनवॉइस प्रदान करेगा nullया ID "इनवॉइस" वाले उपयोगकर्ता के बारे में विवरण देगा?


11
@PathVariableकिसी भी RequestMethod
Kurai Bankusu

1
@ एलेक्सो: इसका java8 से कोई लेना-देना नहीं है, यह java 5 और Spring3.0 के लिए भी काम करता है: मुद्दा यह है कि कोड डीबगिंग सक्षम के साथ संकलित है।
राल्फ

2
@ राल्फ सही, यह डीबगिंग के साथ जावा 8 से पहले काम करता है। जावा 8 के बाद से यह डीबगिंग के बिना भी काम करता है, इसके बजाय "-पैरमेटर्स" का उपयोग करें: docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .com / javase / tutorial / प्रतिबिंबित / सदस्य /…
एलेक्सो

1
@ user3705478: मुझे ऐसा नहीं लगता, क्योंकि वसंत को यह जानने की जरूरत है कि यह एक अनुरोध हैंडलर विधि है। (और निश्चित रूप से: @PathParam केवल तभी काम करता है, जब यूआरआई टेम्पलेट में एक प्लेसहोल्डर हो)
राल्फ

2
@ user3705478: @PathParamएक javax.ws.rs एनोटेशन है। docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
राल्फ

112

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

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

उपरोक्त URL अनुरोध में, param1 और param2 के मान नीचे दिए गए हैं:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

@RequestParam एनोटेशन द्वारा समर्थित मापदंडों की सूची निम्नलिखित हैं:

  • defaultValue - यह फॉलबैक मैकेनिज्म के रूप में डिफॉल्ट वैल्यू है अगर रिक्वेस्ट में वैल्यू नहीं है या यह खाली है।
  • नाम - बांधने के लिए पैरामीटर का नाम
  • आवश्यक - पैरामीटर अनिवार्य है या नहीं। यदि यह सत्य है, तो उस पैरामीटर को भेजने में विफल होना विफल होगा।
  • मूल्य - यह नाम विशेषता के लिए एक उपनाम है

@PathVariable

@ PathVariable आने वाले अनुरोध के लिए URI में उपयोग किए जाने वाले पैटर्न की पहचान करता है। आइए नीचे दिए गए अनुरोध URL को देखें:

http: // localhost: 8080 / springmvc / हैलो / 101 param1 = 10 & param2 = 20

उपरोक्त URL अनुरोध आपके स्प्रिंग MVC में नीचे लिखा जा सकता है:

@RequestMapping("/hello/{id}")    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

@ PathVariable एनोटेशन अनुरोध URI टेम्पलेट को बाइंड करने के लिए केवल एक विशेषता मान है। इसे एकल विधि में कई @ PathVariable एनोटेशन का उपयोग करने की अनुमति है । लेकिन, यह सुनिश्चित करें कि एक से अधिक तरीकों का एक ही पैटर्न न हो।

इसके अलावा एक और दिलचस्प एनोटेशन है: @MatrixVariable

http: // localhost: 8080 / spring_3_2 / matrixvars / स्टॉक; BT.A = 276.70, + 10.40, + 3.91; AZN = 236.00, 103.00 +, + 3.29; SBRY = 375.50, + 7.60 + 2.07

और इसके लिए नियंत्रक विधि

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List<List<String>> outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

लेकिन आपको सक्षम होना चाहिए:

<mvc:annotation-driven enableMatrixVariables="true" >

क्या एक स्ट्रिंग, जैसे कि userNameएक प्रकार का परम है या नहीं? मैं इसे परिवर्तनशील बनाने की ओर झुक रहा हूं, लेकिन यह एक परम भी हो सकता है।
cst1992

1
..और यहाँ मूल पोस्ट है: - javabeat.net/spring-mvc-requestparam-pathvariable
मेहराज मलिक

कर सकते हैं @PathParamऔर @RequestParamबिना का उपयोग कर घोषित किया@RequestMapping
sofs1

29

@RequestParam का उपयोग क्वेरी पैरामीटर (स्थिर मान) के लिए किया जाता है जैसे: http: // localhost: 8080 / गणना / pow? Base = 2 और ext = 4

@PathVariable गतिशील मानों के लिए उपयोग किया जाता है जैसे: http: // localhost: 8080 / गणना / sqrt / 8

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}

सरल और स्पष्ट @alok
आनंद

12

1) क्वेरी पैरामीटर@RequestParam निकालने के लिए उपयोग किया जाता है

http://localhost:3000/api/group/test?id=4

@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
    System.out.println("This is test");
    return ResponseEntity.ok().body(id);
}

जबकि @PathVariableURI से डेटा निकालने सही करने के लिए प्रयोग किया जाता है:

http://localhost:3000/api/group/test/4

@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
    System.out.println("This is test");
    return ResponseEntity.ok().body(id);
}

2) @RequestParamएक पारंपरिक वेब एप्लिकेशन पर अधिक उपयोगी है जहां डेटा ज्यादातर क्वेरी मापदंडों में पारित किया जाता है@PathVariable Restful वेब सेवाओं के लिए अधिक उपयुक्त होता है जहां URL का मान होता है।

3) @RequestParamएनोटेशन डिफ़ॉल्ट मान निर्दिष्ट कर सकता है यदि कोई क्वेरी पैरामीटर मौजूद नहीं है या किसी defaultValueविशेषता का उपयोग करके खाली है , बशर्ते आवश्यक विशेषता है false:

@RestController
@RequestMapping("/home")
public class IndexController {

    @RequestMapping(value = "/name")
    String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
        return "Required element of request param";
    }

}

1
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
 http://localhost:8080/employee/call/7865467

 @RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
 public List<Calls> getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = status", required = false) String callStatus) {

    }

http://localhost:8080/app/call/7865467?status=Cancelled

@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
            @PathVariable(“callId") int callId,
            @RequestParam(value = status", required = true) String callStatus) {

}

1

दोनों एनोटेशन एक ही तरीके से व्यवहार करते हैं।

केवल 2 विशेष वर्ण! ' और '@' एनोटेशन @PathVariable और @RequestParam द्वारा स्वीकार किए जाते हैं।

व्यवहार की जांच करने और पुष्टि करने के लिए मैंने एक स्प्रिंग बूट एप्लिकेशन बनाया है जिसमें केवल 1 नियंत्रक है।

 @RestController 
public class Controller 
{
    @GetMapping("/pvar/{pdata}")
    public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
    {
        return pathdata;
    }

    @GetMapping("/rpvar")
    public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
    {
        return paramdata;
    }
}

अनुरोधों का पालन करते हुए मुझे वही प्रतिक्रिया मिली:

  1. ! स्थानीय होस्ट: 7000 / pvar / @ # $% ^ & * () _ + - = [] {} |, '', / <>।?
  2. ?! स्थानीय होस्ट: 7000 / rpvar परम = @ # $% ^ & * () _ + - = [] {} |, '', / <>।?

! @ दोनों अनुरोधों में प्रतिक्रिया के रूप में प्राप्त किया गया था


0

यह हो सकता है कि एप्लिकेशन / x-www-form-urlencoded midia प्रकार स्थान को + में कनवर्ट करें , और अधिक जानकारी के लिए url + को अंतरिक्ष में परिवर्तित करके डेटा रिकवर करेगा। http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.