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