You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node Libcurl发送multipart/form-data PUT请求遇参数识别问题求助

Pulsar Function API 适配问题

我遇到一个难以适配的Pulsar 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);

  /* 省略自动生成的注释部分 */

  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;
}

我核心困惑的是如何转换这段libcurl代码:

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

我尝试了如下Node Libcurl代码:

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

但API服务器无法识别functionConfig,返回错误:

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

请问该如何解决?


解决方案

你之前的写法错误在于把type=application/json直接拼到了contents字段里,这不符合multipart/form-data的规范。正确的做法是单独指定该字段的contentType属性,对应libcurl里的curl_mime_type调用。

修改后的Node Libcurl代码如下:

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

另外需要注意,因为原请求是PUT方法,你还需要设置自定义请求方法:

curl.setOpt(Curl.option.CUSTOMREQUEST, "PUT");

这样设置后,multipart部分会正确带上Content-Type: application/json的头,API就能识别到functionConfig参数了。

内容的提问来源于stack exchange,提问作者Trevor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:15:30