R - curl(不是 httr)POST 请求,带有 JSON 正文

时间:2021-07-31 23:33:27

标签: r json curl post

首先让我说我了解如何使用“httr”和“curl”包执行 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 的结构正确,因为我可以在其他包中使用它们而不会出现问题。

如有任何帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

找到解决方案了!!

需要在 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)
相关问题