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
相关产品推荐
相关产品推荐

