我正在尝试使用libcurl进行HTTP POST。 HTTP POST需要执行基本身份验证,包括字段并在多个部分中发送文件。我目前使用的是以下内容:
FILE* fo = nullptr;
std::string fullErrPath(errPath);
fullErrPath.append("debug.txt");
fo = fopen(fullErrPath.c_str(), "wb");
CURL *curl;
CURLcode res;
struct curl_httppost* formpost = nullptr;
struct curl_httppost* lastptr = nullptr;
struct curl_slist* headerlist = nullptr;
static const char buf[] = "Expect:";
const char* imgPath = "/path/to/image.jpg";
curl_global_init(CURL_GLOBAL_ALL);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "jpgdata",
CURLFORM_FILE, imgPath,
CURLFORM_CONTENTTYPE, "image/jpeg",
CURLFORM_END);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "submit",
CURLFORM_COPYCONTENTS, "send"
CURLFORM_END);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_URL, urlupload);
headerlist = curl_slist_append(headerlist, buf);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
//curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "field=1");
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
curl_easy_setopt(curl, CURLOPT_USERPWD, credentials);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_STDERR, fo);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
// Response information
int httpCode(0);
static std::string httpData;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &httpData);
res = curl_easy_perform(curl);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
curl_easy_cleanup(curl);
curl_formfree(formpost);
curl_slist_free_all(headerlist);
fclose(fo);
}
我故意离开这部分“// curl_easy_setopt(curl,CURLOPT_POSTFIELDS,”field = 1“);”评论,因为我在网上发现使用CURLOPT_HTTPPOST是没有意义的。这是post。但上面的代码不起作用。 首先,我从服务器获得的http响应代码是400,并且通过检查“debug.txt”,实际上没有数据。我只看到标题。 其次,我需要包含POST字段“field = 1”,但我不知道怎么做而不使用命令“curl_easy_setopt(curl,CURLOPT_POSTFIELDS,”field = 1“);”。
感谢。
答案 0 :(得分:0)
首先,您要为基本身份验证设置CURLOPT_USERPWD。
然后,您需要确定要POST的数据格式。你想要它是多部分的formpost或“常规” - 你不能混合它们,因为这就是HTTP的工作原理。你到目前为止所做的curl_formadd()是多部分formpost,CURLOPT_POSTFIELDS
是常规的(“application / x-www-form-urlencoded”)。
所以你说你想在帖子中添加一个“field = 1”,为了做到这一点并保持多部分,你可以在第二次调用curl_formadd
后插入以下片段。它为帖子添加了另一个“部分”,其中包含您要求的名称和内容:
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "field",
CURLFORM_COPYCONTENTS, "1"
CURLFORM_END);