2012-04-14 52 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"))