एक RESTful POST विधि में मापदंडों का उपयोग कैसे करें


123

मेरा POST तरीका इस प्रकार है:

@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
    System.out.println("param1 = " + param1);
    System.out.println("param2 = " + param2);
}

जब मैं Netbeans में एक जर्सी क्लाइंट बनाता हूं तो पोस्ट विधि को कॉल करने वाला तरीका इस तरह दिखता है:

public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}

जब यह परीक्षण चल रहा हो:

@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}

यह सर्वर में निम्नलिखित आउटपुट देता है:

INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 

मुझे क्या बदलने की आवश्यकता है ताकि पैरामीटर सही मूल्य दे रहे हैं?


क्या आप Android एप्लिकेशन पर इसका उपयोग कर रहे हैं या नहीं?
Android-Droid

मैं अंत में इस पोस्ट विधि को एक एंड्रॉइड ऐप में कॉल करना चाहता हूं। किसी भी तरह webservice को पता नहीं है कि मापदंडों को मूल्यों पर कैसे हस्ताक्षर किया जाए। मैं यह जानना चाहता हूं कि यह कैसे करना है।
क्लेश्वक

जवाबों:


355

आपका @POSTतरीका स्ट्रिंग के बजाय JSON ऑब्जेक्ट को स्वीकार करना चाहिए। जर्सी JAXB का उपयोग मार्शलिंग और अनमरसलिंग JSON ऑब्जेक्ट्स ( विवरण के लिए जर्सी डॉक्स देखें ) का समर्थन करने के लिए करता है । एक वर्ग बनाएं जैसे:

@XmlRootElement
public class MyJaxBean {
    @XmlElement public String param1;
    @XmlElement public String param2;
}

तब आपकी @POSTविधि निम्नलिखित की तरह दिखाई देगी:

@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
    System.out.println("param1 = " + input.param1);
    System.out.println("param2 = " + input.param2);
}

यह विधि JSON ऑब्जेक्ट को HTTP POST के मुख्य भाग के रूप में प्राप्त करने की अपेक्षा करती है। JAX-RS inputइस मामले में HTTP संदेश के कंटेंट बॉडी को अननोनोनेटेड पैरामीटर के रूप में पास करता है। वास्तविक संदेश कुछ इस तरह दिखाई देगा:

POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com

{"param1":"hello","param2":"world"}

इस तरह से JSON का उपयोग स्पष्ट कारणों के लिए काफी सामान्य है। हालांकि, यदि आप इसे जावास्क्रिप्ट के अलावा किसी अन्य चीज में उत्पन्न या उपभोग कर रहे हैं, तो आपको डेटा को ठीक से बचने के लिए सावधान रहना होगा। JAX-RS में, आप इसे लागू करने के लिए MessageBodyReader और MessageBodyWriter का उपयोग करेंगे । मेरा मानना ​​है कि जर्सी में पहले से ही आवश्यक प्रकार (जैसे, जावा आदिम और JAXB लिपटे वर्गों) के साथ-साथ JSON के लिए कार्यान्वयन हैं। JAX-RS डेटा पास करने के लिए कई अन्य तरीकों का समर्थन करता है। चूंकि साधारण तर्क पासिंग का उपयोग करके डेटा पास किया जाता है, इसलिए उन्हें नए वर्ग के निर्माण की आवश्यकता नहीं होती है।


एचटीएमएल <FORM>

पैरामीटर @FormParam का उपयोग करके एनोटेट किया जाएगा :

@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
                   @FormParam("param2") String param2) {
    ...
}

ब्राउज़र "एप्लिकेशन / x-www-form-urlencoded" का उपयोग करके फ़ॉर्म को एन्कोड करेगा । JAX-RS रनटाइम शरीर को डिकोड करने और इसे विधि को पारित करने का ध्यान रखेगा। यहां आपको तार पर क्या देखना चाहिए:

POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25

param1=hello&param2=world

इस मामले में सामग्री URL एन्कोडेड है।

यदि आपको फॉर्मपराम के नामों की जानकारी नहीं है, तो आप निम्नलिखित कार्य कर सकते हैं:

@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
    ...
}

HTTP हेडर

यदि आप HTTP हेडर के माध्यम से पैरामीटर पास करना चाहते हैं तो आप @HeaderParam एनोटेशन का उपयोग कर सकते हैं:

@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
                   @HeaderParam("param2") String param2) {
    ...
}

यहां बताया गया है कि HTTP संदेश कैसा दिखेगा। ध्यान दें कि इस POST में एक निकाय नहीं है।

POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world

मैं इस विधि का प्रयोग सामान्यीकृत पैरामीटर पासिंग के लिए नहीं करूँगा। यह वास्तव में आसान है अगर आपको किसी विशेष HTTP हेडर के मूल्य को एक्सेस करने की आवश्यकता है।


HTTP क्वेरी पैरामीटर

यह विधि मुख्य रूप से HTTP GETs के साथ प्रयोग की जाती है लेकिन यह समान रूप से POST पर लागू होती है। यह @QueryParam एनोटेशन का उपयोग करता है ।

@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
                   @QueryParam("param2") String param2) {
    ...
}

पिछली तकनीक की तरह, क्वेरी स्ट्रिंग के माध्यम से मापदंडों को पारित करने के लिए एक संदेश निकाय की आवश्यकता नहीं होती है। यहाँ HTTP संदेश है:

POST /create?param1=hello&param2=world HTTP/1.1
Content-Length: 0
Host: www.example.com

क्लाइंट साइड पर क्वेरी पैरामीटर को ठीक से एनकोड करने के लिए आपको विशेष रूप से सावधान रहना होगा । कुछ मापदंडों द्वारा लागू URL लंबाई प्रतिबंधों के साथ-साथ एन्कोडिंग से जुड़ी समस्याओं के कारण क्वेरी पैरामीटर का उपयोग करना समस्याग्रस्त हो सकता है।


HTTP पथ पैरामीटर

पथ पैरामीटर क्वेरी पैरामीटर के समान हैं सिवाय इसके कि वे HTTP संसाधन पथ में एम्बेडेड हैं। यह विधि आज के पक्ष में लगती है। HTTP कैशिंग के संबंध में प्रभाव हैं क्योंकि पथ वास्तव में HTTP संसाधन को परिभाषित करता है। @Path एनोटेशन संशोधित होने के बाद से कोड दूसरों से थोड़ा अलग दिखता है और यह @PathParam का उपयोग करता है :

@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
                   @PathParam("param2") String param2) {
    ...
}

संदेश क्वेरी पैरामीटर संस्करण के समान है सिवाय इसके कि पैरामीटर के नाम संदेश में कहीं भी शामिल नहीं हैं।

POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com

यह विधि क्वेरी पैरामीटर संस्करण के समान एन्कोडिंग व्यर्थ को साझा करती है। पथ खंडों को अलग-अलग तरीके से एन्कोड किया गया है, इसलिए आपको वहां भी सावधान रहना होगा।


जैसा कि आप देख सकते हैं, प्रत्येक विधि के लिए पेशेवरों और विपक्ष हैं। विकल्प आमतौर पर आपके ग्राहकों द्वारा तय किया जाता है। यदि आप FORMHTML पृष्ठों की सेवा कर रहे हैं , तो उपयोग करें @FormParam। यदि आपके क्लाइंट जावास्क्रिप्ट + एचटीएमएल 5-आधारित हैं, तो आप संभवतः जेएएक्सबी-आधारित क्रमांकन और जेएसएन ऑब्जेक्ट का उपयोग करना चाहेंगे। MessageBodyReader/Writerकार्यान्वयन ताकि एक कम बात गलत हो सकता है वह यह है कि आवश्यक आप के लिए बचने का ध्यान रखना चाहिए। यदि आपका क्लाइंट जावा आधारित है, लेकिन एक अच्छा एक्सएमएल प्रोसेसर (जैसे, एंड्रॉइड) नहीं है, तो मैं शायद FORMएन्कोडिंग का उपयोग करूंगा क्योंकि सामग्री बॉडी को उत्पन्न करना आसान है और URL की तुलना में ठीक से एनकोड करना आसान है। उम्मीद है कि यह मिनी-विकी प्रविष्टि विभिन्न तरीकों पर कुछ प्रकाश डालती है जो JAX-RS का समर्थन करती है।

नोट: पूर्ण प्रकटीकरण के हित में, मैंने वास्तव में अभी तक जर्सी की इस सुविधा का उपयोग नहीं किया है। हम इसके साथ छेड़छाड़ कर रहे थे क्योंकि हमारे पास कई JAXB + JAX-RS एप्लिकेशन तैनात हैं और मोबाइल क्लाइंट स्पेस में जा रहे हैं। JSON, HTML5 या jQuery- आधारित समाधानों पर XML के लिए अधिक उपयुक्त है।


4
मैंने कल इस सुविधा का परीक्षण किया है, @XmlElement annotations की जरूरत नहीं थी
mmatloka

इसके लिए धन्यवाद। अगर मैं अभी भी 2 स्ट्रिंग्स भेजना चाहता हूं तो रिस्टफुल को उपभोग करने में सक्षम होने की क्या जरूरत है? या मल्टीपल पैरामेट्स केवल @PPParm के साथ काम करते हैं?
कालसर्वक

1
@ कलसावक - आपको यह निर्दिष्ट करने की आवश्यकता है कि प्रत्येक परम कहाँ से निकाले जाने की उम्मीद है। जैसा कि आपके पास चीजें हैं अब जर्सी / नेटबीन्स एक फॉर्म पोस्ट मान रहा है और फॉर्मपर्म के रूप में भेजे गए डेटा को निकाल रहा है। अपने प्रत्येक तरीके को एनोटेट करें जहाँ से आप डेटा चाहते हैं (पाथाराम, फॉर्मपरम, कुकीपरम आदि)
धारणा '

1
@ क्लास्वाक - मैंने विभिन्न एनोटेशन का उपयोग करके उदाहरणों का एक गुच्छा जोड़ा
D.Shawley

2
इस के लिए बहुत बहुत धन्यवाद! यह वास्तव में मैं क्या देख रहा था। आपने मेरा दिन बनाया;) मैं अभी फॉर्मप्रेम का उपयोग कर रहा हूं और यह काम करता है!
क्लेश्वक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.