2012-04-24 26 views
35

का उपयोग करते समय अनुरोध निकाय में डेटा भेजने के लिए कैसे करें मैं जिस सेवा एपीआई का उपभोग कर रहा हूं वह एक GET विधि है जिसके लिए अनुरोध के अनुरोध में डेटा भेजा जाना आवश्यक है।

शरीर में आवश्यक डेटा हाइपन से अलग आईडी की एक सूची है और संभावित रूप से बहुत बड़ा हो सकता है और इस प्रकार इसे शरीर में भेजा जाना चाहिए अन्यथा यह ब्राउज़र/प्रॉक्सी/वेबसर्वर इत्यादि श्रृंखला में कहीं भी फूबर होगा। नोट: मेरे पास सेवा या एपीआई पर नियंत्रण नहीं है इसलिए कृपया इसे बदलने के लिए सुझाव न दें।

मैं निम्नलिखित jQuery कोड का उपयोग कर रहा हूं हालांकि फिडलर में अनुरोध/प्रतिक्रिया देख रहा हूं, मैं देख सकता हूं कि "डेटा" जो मैं भेज रहा हूं वह हमेशा "स्ट्रिंगडाटा" विकल्प को गलत करने के बावजूद क्वेरी स्ट्रिंग में परिवर्तित और जोड़ दिया जाता है। ..

$.ajax({ 
    url: "htttp://api.com/entity/list($body)", 
    type: "GET", 
    data: "id1-id2-id3", 
    contentType: "text/plain", 
    dataType: "json", 
    processData: false, // avoid the data being parsed to query string params 
    success: onSuccess, 
    error: onError 
}); 

कोई भी जानता है कि मैं अनुरोध के शरीर में "डेटा" मान को कैसे भेज सकता हूं? किसी भी सहायता की सराहना की जाती है, अग्रिम धन्यवाद।

+1

तरह लग रहा है? केवल एक चीज जिसे मैं उस घटना के बारे में सोच सकता हूं _remotely_ जो आप पूछ रहे हैं उसके करीब एक POST अनुरोध है ... ('POST/path HTTP/1.0 \ r \ n \ r \ n \ r \ n ') –

+3

यदि एपीआई सामान्य है, और HTTP विनिर्देशों का पालन करता है, मुझे नहीं लगता कि यह एक जीईटी अनुरोध के शरीर में भेजे गए पैरामीटर स्वीकार करेगा, भले ही आप इसे प्रबंधित करते हैं। क्या अापको उस बारे में पूर्ण विशवास है? उपयोगी पोस्ट http: // stackoverflow।कॉम/प्रश्न/978061/http-get-with-request-body – Nikhil

+0

असल में यह संभव नहीं था क्योंकि लोगों ने कहा है कि यह HTTP spec का हिस्सा नहीं है। अंत में हमें आईडी को क्वेरी स्ट्रिंग और पेज पर परिणामों के माध्यम से रखना पड़ा ताकि यह बहुत लंबा न हो। मैं दिए गए उत्तर को स्वीकार करूंगा, धन्यवाद एंडेंडरडमा। –

उत्तर

30

सामान्यतः, यह नहीं है कि सिस्टम जीईटी अनुरोधों का उपयोग कैसे करते हैं। तो, अपने पुस्तकालयों को साथ खेलना मुश्किल होगा। वास्तव में, spec कहता है कि "अगर अनुरोध विधि जीईटी या हेड अधिनियम के लिए एक केस-सेंसिटिव मैच है जैसे डेटा शून्य है।" इसलिए, मुझे लगता है कि आप भाग्य से बाहर हैं जब तक कि आप जिस ब्राउज़र का उपयोग कर रहे हैं वह spec के उस हिस्से का सम्मान नहीं करता है।

आप शायद पोस्ट एजेक्स अनुरोध के लिए अपने सर्वर पर एक एंडपॉइंट सेट कर सकते हैं, फिर उसे अपने सर्वर कोड में किसी शरीर के साथ एक GET अनुरोध पर रीडायरेक्ट करें।

यदि आप डेटा के साथ डेटा के साथ जीईटी अनुरोधों से बिल्कुल बंधे नहीं हैं, तो आपके पास दो विकल्प हैं।

डेटा के साथ पोस्ट: शायद यह वही है जो आप चाहते हैं। यदि आप डेटा पास कर रहे हैं, तो शायद इसका मतलब है कि आप कुछ मॉडल संशोधित कर रहे हैं या सर्वर पर कुछ कार्रवाई कर रहे हैं। इन प्रकार के कार्यों को आम तौर पर POST अनुरोधों के साथ किया जाता है।

क्वेरी स्ट्रिंग डेटा के साथ प्राप्त करें: आप अपने डेटा को क्वेरी स्ट्रिंग पैरामीटर में कनवर्ट कर सकते हैं और उन्हें सर्वर के साथ पास कर सकते हैं।

url: 'somesite.com/models/thing?ids=1,2,3' 
+3

जबकि मैं आपके इनपुट की सराहना करता हूं, दोनों सुझावों में सेवा को बदलने में शामिल है जो मैंने कहा है, संभव नहीं है। –

+0

क्षमा करें, मुझे वह हिस्सा याद आया। कुछ और जानकारी के साथ अपडेट किया गया, लेकिन यह वादा नहीं कर रहा है। – EndangeredMassa

+4

एक प्रॉक्सी जोड़ने के अतिरिक्त सुझाव के लिए धन्यवाद जो एक पोस्ट को एक शरीर के साथ एक जीईटी में परिवर्तित करता है। मैंने इसे .NET में कार्यान्वित करने का प्रयास किया है, लेकिन यह त्रुटि के साथ एक "प्रोटोकॉल उल्लंघन उल्लंघन" अपवाद फेंकता है "इस क्रिया के साथ एक सामग्री-शरीर नहीं भेज सकता" स्पष्ट रूप से फिर से जोर दे रहा है कि शरीर के साथ एक जीईटी सिर्फ एक समर्थन उपयोग मामला नहीं है। –

-1

शायद ज़रुरत पड़े किसी IST अब भी यह प्रश्न के साथ आ रहा है:

किसी भी अनुरोध में एक शरीर क्वेरी वस्तु नहीं है। आपको इसे स्वयं पार्स करने की आवश्यकता नहीं है।

उदा। यदि आप प्राप्त के साथ एक क्लाइंट से एक accessToken भेजना चाहते हैं, तो आप इसे इस तरह से कर सकता है:

const request = require('superagent'); 
 

 
request.get(`http://localhost:3000/download?accessToken=${accessToken}`).end((err, res) => { 
 
    if (err) throw new Error(err); 
 
    console.log(res); 
 
});

सर्वर अनुरोध वस्तु फिर "शरीर में" {request: { ... query: { accessToken: abcfed } ... } }

+0

ओपी 'request.body' मांग रहा है, न कि' request.query'। आप 'POST' का उल्लेख करते हैं लेकिन आप अभी भी अपने कोड नमूने में 'request.get()' का उपयोग करते हैं। – Danosaure

+0

हाँ मैं देखता हूं। लेकिन क्वेरी और बॉडी का उपयोग दोनों ही परिणाम प्राप्त कर सकते हैं। मैंने सोचा कि अनुरोध के लिए अनुरोध करना बहुत आसान था। वैकल्पिक विकल्प के रूप में। –