[英]Asynchronous POST Requests - R, using RCurl?
我試圖從R對REST API發出異步請求。下面的curl命令說明了傳遞給api所需的參數。 我給你們linux的curl命令,因為我希望能說清楚:
curl -v -X POST https://app.example.com/api/ \
-H 'Authorization: somepwd' \
-H "Content-Type: application/json" \
-d {key1: value1, key2: value2}
現在,我通過執行以下操作在R中完成同樣的事情:
library(httr)
library(jsonlite)
content(POST('https://app.example.com/api/'
,add_headers(Authorization = 'somepwd')
,body = toJSON(rDataFrame)
,content_type_json()
)
)
目標是從R提交上述POST請求,但要改變正文中發送的json字符串,並異步執行 。
我一直在尋找能幫助我發出異步請求而不是串行發出請求的軟件包。 我能找到的最接近的是RCurl包中的getURIAsynchronous()函數( https://cran.r-project.org/web/packages/RCurl/RCurl.pdf ),但不了解如何提交PUT請求標題和使用其功能的正文。 我真的想從R做出上面的POST請求但是異步地在哪里URI是相同的,但是發送的數據對於每個請求是不同的。
我找到了這個http://www.omegahat.org/RCurl/concurrent.html
getURIs =
function(uris, ..., multiHandle = getCurlMultiHandle(), .perform = TRUE)
{
content = list()
curls = list()
for(i in uris) {
curl = getCurlHandle()
content[[i]] = basicTextGatherer()
opts = curlOptions(URL = i, writefunction = content[[i]]$update, ...)
curlSetOpt(.opts = opts, curl = curl)
multiHandle = push(multiHandle, curl)
}
if(.perform) {
complete(multiHandle)
lapply(content, function(x) x$value())
} else {
return(list(multiHandle = multiHandle, content = content))
}
}
我的想法是,我可以替換for (i in uris)
for(i in jsons)
我循環遍歷我要發送到同一URL的不同數據,但是我無法理解來自RCurl的以下概念包:
如何將標頭作為PUT請求的一部分傳遞。 如何在請求正文中傳遞數據? 如上所述,使用httr
包非常簡單。
我嘗試傳遞curl選項中的標題,或者標題。 問題是我不明白在哪里傳遞post請求的組成部分: getURIAsynchronous()
函數中的身份驗證,標題和正文,或者我上面描述的任何資源。
有誰知道如何做到這一點? 一個例子將是非常有幫助的。
最近更新了curl
包以處理異步請求( 請參閱此處 )
使用curl
, magrittr
和jsonlite
包,您可以通過以下方式創建異步發布請求:
handle_setform
函數創建包含標題和正文內容的通用句柄 multi_run
運行您的池 示例代碼如下:
library(curl)
library(jsonlite)
library(magrittr)
#create a handle object
h <- new_handle() %>%
handle_setheaders(Authorization = "somepwd",
"Content-Type" = "application/json") %>%
handle_setform(body = toJSON(iris))
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")}
# example vector of uris to loop through
uris <- c("https://app.example.com/api/endpoint1"
,"https://app.example.com/api/endpoint2"
,"https://app.example.com/api/endpoint3")
# all scheduled requests are performed concurrently
sapply(uris, curl_fetch_multi, done=cb, pool=pool)
# This actually performs requests
out <- multi_run(pool = pool)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.