我正在使用RCurl包实现围绕PiCloud的REST API的R包装器向API服务器发出HTTP(S)请求.API使用基本HTTP身份验证来验证用户是否具有足够的权限.PiCloud文档提供了使用api和使用curl进行身份验证的示例:
$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12
Run Code Online (Sandbox Code Playgroud)
这非常有效.将其转换为等效的RCurl命令:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret")
Run Code Online (Sandbox Code Playgroud)
执行此函数我收到以下错误消息:
[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}"
Run Code Online (Sandbox Code Playgroud)
我更深入地探讨了这个问题,我发现curl命令发出的HTTP请求包含了第一个GET命令中的Authorization字段.
RCurl不这样做.相反,它首先发送没有设置授权字段的GET请求.如果它收到401错误代码和带有WWW-Authenticate字段的响应,它将发送另一个带有Authorization字段的GET请求.
虽然HTTP规范要求使用401错误代码返回的消息包含WWW-Authenticate字段但PiCloud API消息不包含.因此,getURL即使使用userpwd选项设置调用,RCurl也不会发送具有授权字段集的GET请求.因此,身份验证将始终失败.
有没有办法强制RCurl在它发送的第一个GET消息中设置授权字段?如果没有,我可以使用其他任何R包?
bel*_*lly 25
我在RCurl的作者Duncan Lang的帮助下解决了这个问题.解决方案是显式设置httpauth选项,该选项将身份验证方法设置为最初尝试.这有效:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L)
Run Code Online (Sandbox Code Playgroud)
httpauth是一个位掩码,用于指定要使用的身份验证方法.有关更多详细信息,请参阅libcurl教程的HTTP身份验证部分.
httr中的等效代码是:
library(httr)
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))
Run Code Online (Sandbox Code Playgroud)