2009-10-20 9 views
7

मैं वर्तमान में आतंक विरोधीrequest.format लौटने */*

पर अपने आवेदन के लिए एक API विकासशील कर रहा हूँ एक उदाहरण के रूप में, मैं कुछ एक्सएमएल, सभी जानकारी मैं वस्तु बनाने की आवश्यकता के साथ भरी हुई बनाया है, के एक मान लीजिए व्यक्ति, और का उपयोग कर कर्ल मैं अपने आवेदन करने के लिए प्रस्तुत

मैं बिल्कुल कॉल करने के लिए कार्रवाई बनाने मैं नियंत्रक से चाहते हैं और वस्तु की हैश पैरामीटर सही ढंग से

पारित किया जा रहा है लेकिन अब मैं करने की जरूरत कर सकती हूं एक्सएमएल के साथ अनुरोध किया गया था या नहीं, तो एक अलग व्यवहार लागू करें, मुझे परेशान करने का कारण यह है कि नियंत्रक request.format मेंदेता है।

कोई सुराग?

curl -v -H "Content-Type: application/xml; charset=utf-8" --data-ascii @client.xml http://foo.com:3000/clients?api_key=xxx 

def create 
    logger.debug request.format # produces "*/*" 
    if request.format.xml? 
    # never gets here 
    end 
end 

उत्तर

14

*/* मतलब यह है कि उपयोगकर्ता-एजेंट सभी प्रारूपों स्वीकार करता है और परवाह नहीं करता कौन-सा प्रारूप दे दें। मेरा मानना ​​है कि सफारी दूसरों के बीच ऐसा करता है। डिफ़ॉल्ट रूप से, curl*/* का स्वीकार्य शीर्षलेख भेजता है।

यहाँ हेडर curl की एक डंप डिफ़ॉल्ट रूप से भेजता है:

User-Agent: curl/7.18.1 (i386-apple-darwin9.6.0) libcurl/7.18.1 zlib/1.2.3 
Host: example.com 
Accept: */* 
Content-Type: 

हालांकि, इस मामले में, ऐसा लगता है कि आप अगर पेलोड भेजा करने के लिए आप एक्सएमएल था एक्सएमएल वापस भेजना चाहते हैं? यदि ऐसा है, तो आप अनुरोध के सामग्री-प्रकार शीर्षलेख को सीधे जांचना चाहते हैं। यानी, request.content_type वह विधि है जो आप चाहते हैं।

अनुशेष: मैं इस बारे में कुछ और सोचा, और मुझे लगता है कि सबसे अच्छा तरीका पहले request.format जाँच करने के लिए और है कि केवल अगर अनिर्णायक जांच request.content_type है। अनिवार्य रूप से, HTTP spec ग्राहकों को सर्वर को यह बताने में सक्षम होने के लिए प्रदान करता है कि "मैं आपको एक्सएमएल दे रहा हूं, लेकिन मुझे जेएसओएन वापस चाहिए।" स्वीकार्य हेडर यह है कि ग्राहक आपको बताते हैं कि वे क्या चाहते हैं, और यदि कोई वास्तव में इसे भेजता है, तो आपको इसका सम्मान करना चाहिए। क्लाइंट निर्दिष्ट नहीं होने पर केवल अनुरोध के सामग्री-प्रकार का संकेत दें।

+0

ब्राउज़र? हम्म, अब तुम मुझे उलझन में डाल दिया। मैं एक कमांड लाइन के माध्यम से अनुरोध भेज रहा हूं, ब्राउज़र प्रकार कोई समस्या नहीं होनी चाहिए –

+0

हाँ, क्षमा करें ... मैं स्पष्ट करूंगा। –

+0

अब यह अधिक समझ में आता है =) धन्यवाद –

0

*/* बस इसका मतलब है कि सभी एमआईएम प्रकार स्वीकार किए जाते हैं।

request.format विधि के लिए कोड को देखते हुए, एमआईएमई प्रकार फ़ाइल एक्सटेंशन द्वारा निर्धारित किया जाता है, या यदि यह मौजूद नहीं है तो HTTP स्वीकृति शीर्षलेख के मान से। इसलिए आपको या तो डिस्क पर सहेजी गई एक्सएमएल फ़ाइल को कर्ल पास करने की आवश्यकता है, या जब आप अपने एपीआई को अनुरोध करते हैं तो एसीएम एमआईएमई प्रकार (उदा। text/xml) पर स्वीकृति हेडर सेट करने के लिए कर्ल प्राप्त करें।

+0

नीचे वोट क्यों? –

+0

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

+0

वर्तमान में सामग्री/एक्सएमएल के रूप में सामग्री-प्रकार का उपयोग कर रहा हूं, पाठ/एक्सएमएल में बदल गया है और यह अभी भी वही अनुरोध उत्पन्न करता है .format (*/*) कर्ल को पास की गई फ़ाइल डिस्क –

संबंधित मुद्दे