首先让我说我了解如何使用“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 的结构正确,因为我可以在其他包中使用它们而不会出现问题。
如有任何帮助,我们将不胜感激。
答案 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)