我正在使用PiCloud's REST API包在RCurl周围实现一个R包装器,以向API服务器发出HTTP(S)请求。 API使用基本HTTP身份验证来验证用户是否具有足够的权限。 PiCloud文档提供了使用api和使用curl进行身份验证的示例:
$ 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命令中的Authorization字段。
RCurl不会这样做。相反,它首先发送没有设置授权字段的GET请求。如果它收到401错误代码和带有WWW-Authenticate字段的响应,它将发送另一个带有Authorization字段的GET请求。
虽然HTTP规范要求使用401错误代码返回的消息包含WWW-Authenticate字段,但PiCloud API消息却不包含。因此,即使使用userpwd选项设置调用getURL
,RCurl也不会发送具有授权字段集的GET请求。因此,身份验证将始终失败。
有没有办法强制RCurl在它发送的第一个GET消息中设置授权字段?如果没有,我可以使用其他任何R包?
答案 0 :(得分:24)
我在RCurl的作者Duncan Lang的帮助下解决了这个问题。解决方案是显式设置httpauth选项,该选项将身份验证方法设置为最初尝试。这有效:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L)
httpauth是一个位掩码,用于指定要使用的身份验证方法。有关详细信息,请参阅the libcurl tutorial的HTTP身份验证部分。
答案 1 :(得分:7)
httr中的等效代码是:
library(httr)
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))