【问题标题】:R - curl (not httr) POST request w/ JSON bodyR - 卷曲(不是 httr)带有 JSON 正文的 POST 请求
【发布时间】:2021-08-01 10:18:13
【问题描述】:

首先让我说我了解如何使用“httr”和“crul”包进行 POST 请求。我正在开发一种异步方法,使用基本的“curl”包发送多个带有唯一 JSON 正文请求的 POST 请求。我有正当理由尝试使用此软件包,但更重要的是,我只是决心让它发挥作用。这可能是不可能的,或者我什至可能在“curl”中尝试错误的功能......但想看看是否有人有任何想法。

我正在尝试使用 curl_fetch_multi() 作为 POST 请求发送一个 post 请求,其中包含这样的正文中的 JSON...

{
  "configuration": {
    "Id": 4507
  },
  "age": 0,
  "zip": 32411,
  "Date": "2020-12-23"
}

我已经成功地至少从 API 中获取了错误消息,指示无效的主体输入,使用的内容类似于从包含我需要提交的每个主体的对象开始

   library(curl)
   library(jsonlite)
   library(magrittr)
   

   pool <- new_pool()

   # results only available through call back function
   cb <- function(req){cat("done:", req$url, ": HTTP:", req$status, "\n", "content:", rawToChar(req$content), "\n")}
   
   # Create request for each body
   for(i in 1:nrow(df)){
     
       curl_fetch_multi(
         "http://api.com/values?api_key=1234",
         done = cb,
         pool = pool,
         handle = new_handle() %>%
           handle_setopt(post = TRUE) %>%
           handle_setheaders("Content-Type"="application/vnd.v1+json") %>%
           handle_setform(body = df$body[[i]])   ###df$body[[i]] is a JSON string
       )
   }
   
   
   # This actually performs requests
   out <- multi_run(pool = pool)

done: http://api.com/values?api_key=1234 : HTTP: 400 
 content: {"errors":[{"code":"Service.input.invalid","message":"Invalid input"}]} 
done: http://api.com/values?api_key=1234 : HTTP: 400 
 content: {"errors":[{"code":"Service.input.invalid","message":"Invalid input"}]} 
....

我 90% 肯定这与它尝试在句柄的 handle_setform() 设置中调用 JSON 的方式有关。这是关于我的头绪和文档稀缺的地方。

另外,我很确定 JSON 的结构是正确的,因为我可以在其他包中毫无问题地使用它们。

任何帮助将不胜感激。

【问题讨论】:

    标签: r json curl post


    【解决方案1】:

    找到解决办法了!!

    需要对handle_setopts()使用以下设置

    for(i in 1:nrow(df)){
     
       curl_fetch_multi(
         "http://api.com/values?api_key=1234",
         done = cb,
         pool = pool,
         handle = new_handle() %>%
               handle_setheaders("Content-Type"="application/v1+json") %>%
               handle_setopt(customrequest = "POST") %>%
               handle_setopt(postfields = df$body[[i]])  #df$body is list of JSON 
       )
    
    
    }
    
    out <- multi_run(pool = pool)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2013-05-30
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多