2012-04-14 24 views
14

API sunucusuna HTTP (S) istekleri yapmak için RCurl paketini kullanarak bir R sarıcısını yaklaşık PiCloud's REST API uygulıyorum. API, kullanıcıların yeterli izinlere sahip olduğunu doğrulamak için Temel HTTP kimlik doğrulamasını kullanır. PiCloud belgeleri, api'yi kullanma ve kimlik doğrulaması için bir örnek verir: Bu, mükemmel çalışır. Aşağıdaki hata iletisini bu işlevi yürütmeRCurl: HTTP WWW-Kimlik Doğrulaması Olmadan HTTP 401 Koduna Yanıt Verildiğinde HTTP Kimlik Doğrulaması

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

: eşdeğer RCurl emri bu çevirme

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

konuyu daha derinlemesine keşfetmek ben bukle komutu tarafından yapılan HTTP istekleri dahil olduğu tespit İlk GET komutunda Yetkilendirme alanı.

RCurl bunu yapmaz. Bunun yerine önce yetki alanı ayarlanmadan bir GET isteği gönderir. 401 hata kodu VE WWW-Authenticate alanıyla bir cevap alırsa Yetkilendirme alanına başka bir GET isteği gönderir.

HTTP Spec WWW-Authenticate alan PiCloud API mesajları yok içerecek bir 401 hata kodu ile dönmek iletileri gerektirir rağmen. Böylelikle, userpwd set set RCurl ile bile getURL çağırıldığında, yetki alanı ayarlanmış bir GET isteği gönderilmez. Sonuç olarak kimlik doğrulaması her zaman başarısız olur.

gönderir ilk GET mesajında ​​Yetkilendirme alanını ayarlamak için RCurl zorlamak için herhangi bir yolu var mı? Kullanmayabileceğim başka R paketleri yok mu?

cevap

23

Ben RCurl Duncan Lang yazarı yardımıyla sorunu çözdüm. Çözüm, başlangıçta denemek için kimlik doğrulama yöntemini ayarlayan httpauth seçeneğini açıkça ayarlamalıdır. Bu çalışır:

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

httpauth kimlik doğrulama yöntemleri kullanmak için bir bit maskesi belirten olduğunu. Daha fazla ayrıntı için the libcurl tutorial'un HTTP Kimlik Doğrulama bölümüne bakın. HTTR içinde

+1

. Teşekkürler! –

+0

yeniden kullanılabilir bukle sapı geçen varsa, getCurlHandle 'çağrınızda()' in 'httpauth = 1' belirlemek zorunda. (PostForm() 'ı temel auth ile çalışmak için kullanabilmemin tek yolu buydu:' httpauth 'parametresini postForm() 'a çevirmek için bir parametre olarak kullanmak işe yaramadı. –

6

eşdeğer kod: Ben saatlerce bu izini çalışıyorum

library(httr) 
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret")) 
İlgili konular