2012-04-14 39 views
14

我正在實施一個圍繞PiCloud's REST API R包裝使用RCurl包提出HTTP(S)請求到API服務器。該API使用基本HTTP身份驗證來驗證用戶是否擁有足夠的權限。 PiCloud文檔給出了使用api和使用curl進行身份驗證的示例:RCurl:HTTP身份驗證當站點響應與HTTP 401代碼沒有WWW身份驗證

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

這很好用。翻譯這等同RCurl的命令:

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

執行這個功能我收到以下錯誤信息:

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

更深入探索的問題,我發現,通過curl命令作出的HTTP請求包括第一個GET命令中的授權字段。

RCurl不這樣做。相反,它首先發送一個沒有授權字段集的GET請求。如果它收到一個401錯誤代碼和一個帶有WWW-Authenticate字段的響應,它會發送另一個帶有授權字段的GET請求。

雖然HTTP規範要求使用401錯誤代碼返回的消息包含WWW-Authenticate字段,但PiCloud API消息不會。因此,即使使用userpwd選項調用getURL,RCurl也不會發送帶授權字段集的GET請求。結果,身份驗證將始終失敗。

有什麼辦法強制RCurl在它發送的第一個GET消息中設置授權字段?如果沒有,我可以考慮使用其他R包嗎?

回答

23

我已經在RCurl,Duncan Lang的作者的幫助下解決了這個問題。解決方案是顯式設置httpauth選項,該選項將身份驗證方法設置爲初始嘗試。此作品:

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

httpauth是一個位掩碼,指定要使用哪種驗證方法。有關更多詳細信息,請參閱the libcurl tutorial的HTTP身份驗證部分。

+1

我一直在試圖跟蹤下來了幾個小時。謝謝! – 2013-04-13 02:01:23

+0

如果傳入可重用的捲曲句柄,則必須在調用getCurlHandle()'時設置'httpauth = 1'。 (這是我得到'postForm()'以使用基本身份驗證的唯一方式:將'httpauth'作爲參數傳遞給'postForm()'不起作用。) – 2015-11-24 16:49:16

6

等效代碼HTTR是:

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