【问题标题】:Node Libcurl (node-libcurl) - trouble with multipart/form-data requestNode Libcurl (node-libcurl) - 多部分/表单数据请求的问题
【发布时间】:2022-08-14 02:16:36
【问题描述】:

我有一个特别顽固的 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 输出

#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.js curl fetch-api apache-pulsar node-libcurl


    【解决方案1】:

    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' }
    ]);
    

    如果这不起作用,请告诉我。

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 2017-11-07
      • 2018-08-12
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多