带有基本身份验证和字段的HTTP POST(libcurl c ++)

时间:2017-03-30 19:04:53

标签: c++ post libcurl

我正在尝试使用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“);”。

感谢。

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