मैं स्प्रिंग बूट एप्लिकेशन पर काम कर रहा हूं। मेरे पास निम्नलिखित आरईएसटी एंडपॉइंट हैं:

 @GetMapping(value = { "/person/{name}", "/person/{age}" })
 public PersonData getPersonData(@PathVariable(required = false) String name,
                                 @PathVariable(required = false) Integer age) {

}

इस समापन बिंदु को नाम चर या आयु चर के साथ बुलाया जा सकता है, हालांकि ऐसा लगता है कि यह उनके बीच अंतर नहीं कर सकता है। अगर मैं '.../person/20' को कॉल करता, तो यह "/person/{age}" नहीं कहता, लेकिन यह हमेशा "/person/{name}" कहता है।

मुझे पता है कि मैं कुछ ऐसा बना सकता हूं:

@GetMapping(value = { "/person/name/{name}", "/person/age/{age}" })

हालांकि रास्ते में कुछ भी जोड़े बिना इसे हल करने का कोई और तरीका है?

3
Ben 29 जून 2021, 12:04

2 जवाब

age और name तार्किक रूप से एक ही बात नहीं हैं; चुना गया सबसे अच्छा उत्तर उन्हें विशिष्ट मापदंडों के रूप में रखने का सुझाव देता है।

हालाँकि आप जाँच सकते हैं कि क्या मान संख्यात्मक है और इसे age की तरह व्यवहार करें,

@GetMapping("/person/{value}")
public String getPerson(@PathVariable String value) {
    if (value.matches("[0-9]|[0-9][0-9]"))
        return "Age";
    else
        return "Name";
}

लेकिन यह अस्पष्ट और त्रुटि प्रवण है (जैसे shoeSize या numberOfPartners?)

1
Kamafeather 29 जून 2021, 12:11

आपके मामले में मैं अधिक स्पष्ट होने के लिए 2 अलग-अलग समापन बिंदु बनाउंगा, प्रत्येक को अपने स्वयं के क्वेरी पैरामीटर की सेवा की आवश्यकता होगी।

 @GetMapping(value = "/person")
 public PersonData getPersonDataByName(@RequestParam(required = true) String name) {
 ....
}


 @GetMapping(value = "/person")
     public PersonData getPersonDataByAge(@RequestParam(required = true) Integer age) {
 ....   
    }

required = true को एनोटेशन से छोड़ा जा सकता है क्योंकि यह डिफ़ॉल्ट मान है, मैंने इसका उपयोग केवल यह इंगित करने के लिए किया था कि प्रत्येक समापन बिंदु केवल उस विशिष्ट क्वेरी पैरामीटर के लिए पूरा किया जाएगा

2
Boug 29 जून 2021, 12:27