我正在實施一個圍繞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包嗎?
我一直在試圖跟蹤下來了幾個小時。謝謝! – 2013-04-13 02:01:23
如果傳入可重用的捲曲句柄,則必須在調用getCurlHandle()'時設置'httpauth = 1'。 (這是我得到'postForm()'以使用基本身份驗證的唯一方式:將'httpauth'作爲參數傳遞給'postForm()'不起作用。) – 2015-11-24 16:49:16