RCurl:HTTP身份验证,当站点使用HTTP 401代码响应而不使用WWW身份验证时

RCurl:HTTP身份验证,当站点使用HTTP 401代码响应而不使用WWW身份验证时,r,rcurl,R,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:

我正在实现一个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认证字段的响应,它将发送另一个带有授权字段的GET请求

尽管HTTP规范要求返回401错误代码的消息包含WWW身份验证字段,但PiCloud API消息不需要。因此,在调用
getURL
时,即使设置了userpwd选项,RCurl也不会发送设置了authorization字段的GET请求。因此,身份验证将始终失败


有没有办法强制RCurl在它发送的第一条GET消息中设置授权字段?如果没有的话,还有其他的R软件包我可以考虑使用吗

在RCurl的作者Duncan Lang的帮助下,我解决了这个问题。解决方案是显式设置httpauth选项,该选项将身份验证方法设置为最初尝试。这项工作:

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

httpauth是一个位掩码,指定要使用的身份验证方法。有关详细信息,请参阅的HTTP身份验证部分

httr中的等效代码为:

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

我已经试着追查了好几个小时了。谢谢如果传入可重用的curl句柄,则必须在调用
getCurlHandle()
时设置
httpauth=1
。(这是我使用基本身份验证时获得
postForm()
的唯一方法:将
httpauth
作为参数传递到
postForm()
不起作用。)