16

我正在使用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

这完美地工作。将其转换为等效的 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 消息却没有。因此,getURL即使设置了 userpwd 选项,RCurl 也永远不会发送带有授权字段集的 GET 请求。因此,身份验证将始终失败。

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

4

2 回答 2

28

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

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

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

于 2012-04-15T14:41:06.187 回答
8

httr 中的等效代码是:

library(httr)
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))
于 2014-07-30T20:39:13.277 回答