【问题标题】:Translating cURL API into an R request将 cURL API 转换为 R 请求
【发布时间】:2023-08-10 11:52:01
【问题描述】:

我正在尝试在 R 中创建一个使用 API 的脚本。在标准cURL 格式中,请求如下所示:

curl --request GET \
     --url https://api.test.com/v4/Questions/54949 \
     --header 'Accept: application/json' \
     --header 'Authorization: Basic XXXX123456789'

当我使用httr 包时,我尝试运行这个请求:

get_data <- GET("https://api.test.com/v4/Questions/54949", add_headers(authorization = 'XXXX123456789'))

但是当我检查get_data 中存储的内容时,我遇到了以下情况:

Response [https://api.test.com/v4/Questions/54949]
  Date: 2021-08-03 18:59
  Status: 401
  Content-Type: application/json; charset=utf-8
  Size: 247 B
{
  "errors": [
    {
      "code": "UNAUTHORIZED",
      "text": "The request could not be authorized because a session is not present, an Authentication header was n...
    }
  ] 

我错过了什么?我运行GET 请求是否错误?

编辑:根据@hobo 的回答,我尝试了:

    GET(
  "https://api.securevan.com/v4/surveyQuestions/441560",
  accept_json(),
  add_headers(Authorization = 'Basic 7x99x744-x69x-8956-x44x-4544xx7x7481'))

但我仍然得到相同的响应?

【问题讨论】:

  • 抱歉,没有注意到您更新了问题。我现在很确定您的代码与原始问题匹配,因此我只是使用您上次更新的 Authorization 标头运行 cURL。它返回 HTML,而不是 JSON。该 HTML 包含“DOSarrest Internet Security”,因此您可能已经触发了该站点的 DDoS 保护。也许您的帐户已被禁用?虽然它帮助我检查,但发布实际的 Auth 凭据可能不是一个好主意 - 这就像发布您的用户名和密码一样。

标签: r httr rcurl


【解决方案1】:

您的标题中似乎缺少“基本”。这有效:

GET(
  "http://httpbin.org/basic-auth/user/passwd",
  add_headers(authorization = paste0('Basic ', jsonlite::base64_enc('user:passwd')))
)

虽然我很想使用 authenticate 函数 - 对我来说看起来更干净:

GET(
  "http://httpbin.org/basic-auth/user/passwd",
  authenticate("user", "passwd")
)

更新

根据您的跟进,尝试以下操作,(我认为)将与您的原始 cURL 匹配:

GET(
  "https://api.test.com/v4/Questions/54949",
  accept_json(),
  add_headers(Authorization = 'Basic XXXX123456789'))
)

【讨论】:

  • 请看我的编辑,我还是有同样的问题
  • 啊 - 抱歉我不清楚。您不需要对令牌进行编码 - 它已经编码。你只是缺少“基本”,所以它应该只是 add_headers(authorization = 'Basic XXXX123456789') 而不是 add_headers(authorization = 'XXXX123456789')
  • 我刚试过GET( "https://api.secure.com/v4/surveyQuestions/331816", add_headers(authorization = 'Basic 5f68f511-x36x-1234-x94x-9493xx83')) 得到:"errors": [ { "code": "BAD_REQUEST", "text": "An error has occurred." } ]
  • 我假设“5f68f511-x36x-1234-x94x-9493xx83”与您的 cURL 请求中的“XXXX123456789”是同一个字符串?在这种情况下,您可能已经解决了身份验证问题,但您可能需要为 cURL 的 'Accept: application/json' 部分添加另一个标头。
  • 您可以通过重试不带 --header 'Accept: application/json' \ 部分的 cURL 来检查这一点