C / C libcurl如何发布表单,只是普通的Web表单提交数据

问题描述 投票:1回答:2

我想模拟向PHP API提交Web表单,但是失败了,我尝试了很多方法。我的代码

#define HADES "Content-Type:application/x-www-form-urlencoded;charset=utf-8"

int SendPacket(char *packet, const char *server)
{
    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();
    if (!curl) {
        return -1;
    }
    CURLcode ret;
    struct curl_slist *haderlist = NULL;
    struct curl_httppost *post = NULL;
    struct curl_httppost *last = NULL;
    haderlist = curl_slist_append(haderlist, HADES);

    curl_formadd(&post, &last, CURLFORM_COPYNAME, "username",
             CURLFORM_COPYCONTENTS,
             "11111111111", CURLFORM_END);
    curl_formadd(&post, &last, CURLFORM_COPYNAME, "password",
             CURLFORM_COPYCONTENTS,
             "111111", CURLFORM_END);
    curl_formadd(&post, &last, CURLFORM_COPYNAME, "client", CURLFORM_FILE,
             "wap", CURLFORM_END);


    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, haderlist);
    curl_easy_setopt(curl, CURLOPT_URL, server);
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);

    //SendData
    ret = curl_easy_perform(curl);
    if (ret != CURLE_OK ) {
        curl_easy_strerror(ret);

        return -1;
    }
    return 0;
}

我将post的参数更改为这种格式,可以正常发送,如下所示:username = 11111&password = 1111&client = wap,而不是使用form_add函数,但是我不知道该怎么做。enter image description hereenter image description here如何解决这个问题?我不知道

libcurl cc
2个回答
0
投票

您正在混合表单编码。 CURLOPT_POSTFIELDS期望使用URL编码形式(例如username = 11111&password =1111&client=wap),而curl_formadd生成multipart/form-data编码形式。可以将CURLOPT_HTTPPOSTcurl_formadd一起使用,或者以url编码形式使用CURLOPT_POSTFIELDS

无论哪种情况,您都不需要添加Content-Type标头,因为它会自动添加。


0
投票
 tried to use mime to successfully solve the code as follows

int SendPacket(char *packet, const char *server)
{
    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();
    if (!curl) {
        return -1;
    }
    CURLcode ret;

    curl_mime *mime;
    curl_mimepart *part1;
    curl_mimepart *part2;
    curl_mimepart *part3;
    curl_mimepart *part4;
    curl_mimepart *part5;
    mime = curl_mime_init(curl);
    part1 = curl_mime_addpart(mime);
    part2 = curl_mime_addpart(mime);
    part3 = curl_mime_addpart(mime);
    part4 = curl_mime_addpart(mime);
    part5 = curl_mime_addpart(mime);
    //Add part to the mime handle, each of which is a pair of key(name)value(data)
    curl_mime_data(part1, "login", CURL_ZERO_TERMINATED);
    curl_mime_name(part1, "act");
    curl_mime_data(part2, "index", CURL_ZERO_TERMINATED);
    curl_mime_name(part2, "op");
    curl_mime_data(part3, "111111", CURL_ZERO_TERMINATED);
    curl_mime_name(part3,"username");
    curl_mime_data(part4, "111111", CURL_ZERO_TERMINATED);
    curl_mime_name(part4, "password");
    curl_mime_data(part5, "wap", CURL_ZERO_TERMINATED);
    curl_mime_name(part5, "client");

    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
    curl_easy_setopt(curl, CURLOPT_URL, server);    
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, NULL);

    ret = curl_easy_perform(curl);
    if (ret != CURLE_OK ) {
        curl_easy_strerror(ret);

        return -1;
    }
    return 0;
}

Above is mock to simulate web form submission
© www.soinside.com 2019 - 2024. All rights reserved.