簡體   English   中英

異步POST請求 - R,使用RCurl?

[英]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的以下概念包:

  1. 如何將標頭作為PUT請求的一部分傳遞。 如何在請求正文中傳遞數據? 如上所述,使用httr包非常簡單。

  2. 我嘗試傳遞curl選項中的標題,或者標題。 問題是我不明白在哪里傳遞post請求的組成部分: getURIAsynchronous()函數中的身份驗證,標題和正文,或者我上面描述的任何資源。

有誰知道如何做到這一點? 一個例子將是非常有幫助的。

最近更新了curl包以處理異步請求( 請參閱此處

使用curlmagrittrjsonlite包,您可以通過以下方式創建異步發布請求:

  • 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM