簡體   English   中英

Node Libcurl (node-libcurl) - 多部分/表單數據請求的問題

[英]Node Libcurl (node-libcurl) - trouble with multipart/form-data request

我有一個特別頑固的 api ,我只能使用以下 curl 請求:

curl --request PUT -H "Content-Type: multipart/form-data" -H "Authorization: Bearer abcd" -F functionConfig='{"parallelism":2};type=application/json' http://test-pulsar:8080/admin/v3/functions/test/ingest/test-entity-FeedTransformer

這是--libcurl output

#include <curl/curl.h>

int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd;
  curl_mime *mime1;
  curl_mimepart *part1;
  struct curl_slist *slist1;

  mime1 = NULL;
  slist1 = NULL;
  slist1 = curl_slist_append(slist1, "Content-Type: multipart/form-data");
  slist1 = curl_slist_append(slist1, "Authorization: Bearer abcd");

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://test-pulsar.com:8080/admin/v3/functions/test/ingest/test-entity-FeedTransformer");
  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
  mime1 = curl_mime_init(hnd);
  part1 = curl_mime_addpart(mime1);
  curl_mime_data(part1, "{\"parallelism\":2}", CURL_ZERO_TERMINATED);
  curl_mime_name(part1, "functionConfig");
  curl_mime_type(part1, "application/json");
  curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
  curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.79.1");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
  curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "PUT");
  curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA set to a objectpointer
  CURLOPT_INTERLEAVEDATA set to a objectpointer
  CURLOPT_WRITEFUNCTION set to a functionpointer
  CURLOPT_READDATA set to a objectpointer
  CURLOPT_READFUNCTION set to a functionpointer
  CURLOPT_SEEKDATA set to a objectpointer
  CURLOPT_SEEKFUNCTION set to a functionpointer
  CURLOPT_ERRORBUFFER set to a objectpointer
  CURLOPT_STDERR set to a objectpointer
  CURLOPT_HEADERFUNCTION set to a functionpointer
  CURLOPT_HEADERDATA set to a objectpointer

  */

  ret = curl_easy_perform(hnd);

  curl_easy_cleanup(hnd);
  hnd = NULL;
  curl_mime_free(mime1);
  mime1 = NULL;
  curl_slist_free_all(slist1);
  slist1 = NULL;

  return (int)ret;
}

我相信我被難倒的主要部分是如何轉換以下內容:

curl_mime_data(part1, "{\"parallelism\":2}", CURL_ZERO_TERMINATED);
curl_mime_name(part1, "functionConfig");
curl_mime_type(part1, "application/json");

我試過的:

curl.setOpt(Curl.option.HTTPPOST, [
  {
    name: "functionConfig",
    contents: '{"parallelism":1};type=application/json',
  },
]);

但是api服務器不識別functionConfig

{"reason":"Function config is not provided"}

如何解決?

node-libcurl作者在這里。 我將發布我在原始問題中發布的相同答案:curl mime API 不可用,請參閱https://github.com/JCMais/node-libcurl/issues/112以獲取功能請求。

您可以使用的是HTTPPOST選項(已棄用,但仍在使用)。

它會是這樣的:

curl.setOpt(Curl.option.HTTPPOST, [
    { name: 'functionConfig', contents: '{"parallelism":2}'}
]);

在上面的示例中,您確實丟失了內容類型。 如果這對您使用的服務器很重要,那么設置它的唯一方法是將數據保存到臨時文件並將該文件用作數據源:

curl.setOpt(Curl.option.HTTPPOST, [
    { name: 'functionConfig', file: '/path-to-temp-file', type: 'application/json' }
]);

如果這不起作用,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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