【问题标题】:Converting a cURL command to HTTR in R在 R 中将 cURL 命令转换为 HTTR
【发布时间】:2021-08-26 18:17:12
【问题描述】:

我有一个 cURL 命令,我想使用 httr 包将其转换为 R。 cURL 命令看起来像这样(显然,鉴于某些保密限制,我无法发布它的全部范围):

curl --request POST \
     --url https://api.cfb.com/v1/players/110960703/stats \
     --header 'Accept: application/json' \
     --header 'Authorization: Basic ThisIsWhereTheAPIKeyGoes==' \
     --header 'Content-Type: application/json' \
     --data '
{
     "statsContext": {
          "statsId": "1"
     },
     "responses": [
          {
                    "type": "ReceiverStats",
                    "QuestionId": "466069",
                    "ResponseId": "1898226"
          }
     ]
}
'

我想将其转换为如下所示的 HTTR 脚本:

ExportIdAPI <- POST(
  'https://api.cfb.com/v1/players/110960703/stats',
  accept_json(),                       
  content_type_json(),                  
  add_headers(Authorization = Basic ThisIsWhereTheAPIKeyGoes==),  
  encode = "json",
  body=list(statsId = 1,
            QuestionId = 466069,
            ResponseId = 1898226))

问题是,这个脚本不起作用。这个脚本有什么作用:

ExportIdAPI <- POST(
      'https://api.cfb.com/v1/players/110960703/stats',
      accept_json(),                       
      content_type_json(),                  
      add_headers(Authorization = Basic ThisIsWhereTheAPIKeyGoes==),  
      encode = "json",
      body=list(statsId = 1))

根据原始 curl 请求的结构,我只是没有将其存储在 body=list 语句中吗?

编辑:我应该注意到这个脚本运行得非常好。我只是不希望它以这种方式构建,我希望它能够更好地反映我试图从上面实现的格式。

headers = c(
  `Accept` = 'application/json',
  `Authorization` = 'Basic ThisIsWhereTheAPIKeyGoes==',
  `Content-Type` = 'application/json'
)

data = ' { "statsContext": { "statsId": "1" }, "responses": [ { "type": "SurveyResponse", "QuestionId": "466069", "ResponseId": "1898226" } ] } '

res <- httr::POST(url = 'https://api.cfb.com/v1/players/110960703/stats', httr::add_headers(.headers=headers), body = data)

编辑 2:根据 MrFlick 的回复,我尝试运行:

ExportIdAPI <- POST(
  'https://api.cfb.com/v1/players/110960703/stats',
  accept_json(),                       
  content_type_json(),                  
  add_headers(Authorization = Basic ThisIsWhereTheAPIKeyGoes==),  
  encode = "json",
  data = list(statsContext = list(statsId = 1), responses= list(list(type="SurveyResponse", QuestionId="466069", ResponseId="1898226")))
)

但我遇到了以下错误:

Response [https://api.cfb.com/v1/players/110960703/stats]
  Date: 2021-08-26 20:58
  Status: 400
  Content-Type: application/json; charset=utf-8
  Size: 144 B
{
  "errors": [
    {
      "code": "INVALID_PARAMETER",
      "text": "The body of the request is null or cannot be parsed."
    }
  ]

【问题讨论】:

  • @MrFlick 查看我刚刚所做的编辑。希望这会有所帮助。
  • @MrFlick 感谢您的回复。我尝试输入您在上面写的内容,但我仍然收到错误消息。请查看编辑。
  • @MrFlick 只是跟进
  • POST() 请求应该使用我的示例中的POST(body=data),或者使用POST(body=list(...)) 没有POST(data=) 参数。我在下面添加了一个完整的答案。

标签: r httr


【解决方案1】:

POST 函数的httr documentation 提供了如何发布 json 的示例。

在您的情况下,您实际上可以将 cURL 命令的 json 复制到 POST 函数的 body 参数:

ExportIdAPI <- POST(
     'https://api.cfb.com/v1/players/110960703/stats',
     accept_json(),                       
     content_type_json(),                  
     add_headers(Authorization = 'Basic ThisIsWhereTheAPIKeyGoes=='),
     body = '
{
     "statsContext": {
       "statsId": "1"
     },
     "responses": [
          {
                    "type": "ReceiverStats",
                    "QuestionId": "466069",
                    "ResponseId": "1898226"
          }
     ]
}', encode = "raw")

【讨论】:

    【解决方案2】:

    您可以让ROST() 请求为您设置 JSON 格式。作为一般规则,命名列表转换为 JSON 对象{},未命名列表转换为数组[]。你可以这样做

    POST(
      'https://api.cfb.com/v1/players/110960703/stats',
      accept_json(),                       
      content_type_json(),                  
      add_headers(Authorization = "Basic ThisIsWhereTheAPIKeyGoes=="),  
      encode = "json",
      body = list(
        statsContext = list(
           statsId = 1
        ), 
        responses= list(
           list(
             type="SurveyResponse", 
             QuestionId="466069", 
             ResponseId="1898226"
           )
         )
       )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多