2012-04-14 10 views
14

मैं एपीआई सर्वर को HTTP (एस) अनुरोध करने के लिए RCurl पैकेज का उपयोग करके PiCloud's REST API के आसपास एक आर रैपर लागू कर रहा हूं। एपीआई बुनियादी HTTP प्रमाणीकरण का उपयोग यह सत्यापित करने के लिए करता है कि उपयोगकर्ताओं के पास पर्याप्त अनुमतियां हैं।आरसीयूआरएल: HTTP प्रमाणीकरण जब साइट डब्ल्यूडब्ल्यूडब्ल्यू के बिना HTTP 401 कोड के साथ प्रतिक्रिया करता है- प्रमाणीकृत

$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12 

यह पूरी तरह से काम करता है: PiCloud प्रलेखन एपीआई का उपयोग करने और कर्ल को प्रमाणित करने का एक उदाहरण देता है। एक बराबर RCurl के आदेश को यह अनुवाद कर रहा है:

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret") 

इस समारोह मैं निम्नलिखित त्रुटि संदेश प्राप्त होता निष्पादित:

[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}" 

और अधिक गहराई में इस मुद्दे को तलाश मैंने पाया कि HTTP कर्ल आदेश द्वारा किए गए अनुरोधों शामिल पहले जीईटी कमांड में प्राधिकरण फ़ील्ड।

आरसीआरएल ऐसा नहीं करता है। इसके बजाय यह प्राधिकरण फ़ील्ड सेट के बिना पहले एक जीईटी अनुरोध भेजता है। अगर इसे 401 त्रुटि कोड प्राप्त होता है और WWW-प्रमाणीकरण फ़ील्ड के साथ प्रतिक्रिया प्राप्त होती है तो यह प्राधिकरण फ़ील्ड के साथ एक और GET अनुरोध भेजती है।

हालांकि HTTP spec को उन संदेशों की आवश्यकता होती है जो WW4-प्रमाणीकरण फ़ील्ड PiCloud API संदेशों को शामिल करने के लिए 401 त्रुटि कोड के साथ वापस आते हैं। इस प्रकार getURL को उपयोगकर्ताpwd विकल्प सेट के साथ भी कॉल करते समय RCurl प्राधिकरण फ़ील्ड सेट के साथ कभी भी GET अनुरोध नहीं भेजेगा। नतीजतन प्रमाणीकरण हमेशा असफल हो जाएगा।

क्या आरसीआरएल को पहले जीईटी संदेश में प्राधिकरण फ़ील्ड सेट करने के लिए मजबूर करने का कोई तरीका है? यदि नहीं हैं तो क्या कोई अन्य आर पैकेज है जिसे मैं उपयोग में देख सकता हूं?

उत्तर

23

मैंने आरसीआरएल, डंकन लैंग के लेखक की मदद से समस्या का समाधान किया है। समाधान स्पष्ट रूप से httpauth विकल्प सेट करना है जो प्रारंभिक रूप से प्रयास करने के लिए प्रमाणीकरण विधि सेट करता है। यह काम करता है:

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L) 

httpauth एक बिटमास्क है जो निर्दिष्ट करने के लिए प्रमाणीकरण विधियों को निर्दिष्ट करता है। अधिक जानकारी के लिए the libcurl tutorial के HTTP प्रमाणीकरण अनुभाग देखें।

+1

मैं घंटों के लिए इस पर नज़र रखने की कोशिश कर रहा हूँ। धन्यवाद! –

+0

यदि पुन: प्रयोज्य कर्ल हैंडल में गुजरना है, तो आपको getCurlHandle() 'पर अपने कॉल में 'httpauth = 1' सेट करना होगा। (यह एकमात्र तरीका था जिसे मैं मूल लेख के साथ काम करने के लिए 'पोस्टफॉर्म()' प्राप्त कर सकता था: 'पोस्टफॉर्म()' के पैरामीटर के रूप में 'httpauth' को पास करने से काम नहीं हुआ।) –

6

बराबर कोड httr में है:

library(httr) 
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret")) 
संबंधित मुद्दे