C / C libcurl как отправить форму POST, просто обычные данные отправки веб-формы - PullRequest
1 голос
/ 11 марта 2020

Я хочу смоделировать отправку веб-формы в API PHP, но она не работает, я перепробовал много методов. Мой код

#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 Как решить эту проблему? Понятия не имею

Ответы [ 2 ]

0 голосов
/ 13 марта 2020
 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;

    mime = curl_mime_init(curl);
    part1 = curl_mime_addpart(mime);
    part2 = curl_mime_addpart(mime);
    part3 = 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, "111111", CURL_ZERO_TERMINATED);
    curl_mime_name(part1,"username");
    curl_mime_data(part2, "111111", CURL_ZERO_TERMINATED);
    curl_mime_name(part2, "password");
    curl_mime_data(part3, "wap", CURL_ZERO_TERMINATED);
    curl_mime_name(part3, "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
0 голосов
/ 13 марта 2020

Вы смешиваете кодировки форм. CURLOPT_POSTFIELDS ожидает URL-кодированную форму (например, username = 11111&password =1111&client=wap), тогда как curl_formadd генерирует multipart/form-data кодированную форму. Либо используйте CURLOPT_HTTPPOST с curl_formadd, либо используйте CURLOPT_POSTFIELDS в URL-кодированной форме.

В любом случае вам не нужно добавлять заголовок Content-Type, поскольку он будет добавлен автоматически.

...