Как переписать POST-запрос с python на C ++ с помощью curl - PullRequest
1 голос
/ 10 января 2020

У меня есть POST-запрос на python с множеством настроек, и я не понимаю, как они выглядят в curl.

data_str = '{' + '"username": "{}", "domain_id": {}, "password": {}'.format(login, domain_id, password) + '}'
      try:
            data = requests.post("https://example.com/v/session",
                                 proxies=proxy,
                                 verify=False,
                                 data=data_str,
                                 headers={"Content-Type": "application/json;charset=UTF-8",
                                          "Accept": "application/json"})
            if is_json(data.text):
                print(data)

Я считаю, что url устанавливает параметр CURLOPT_URL, заголовки - CURLOPT_HTTPHEADER , Но как установить прокси, проверить данные? Как получить json как в python? как завершить код, чтобы он имел тот же результат, что и в python:

CURL *curl = curl_easy_init();

struct curl_slist *list = NULL;

if(curl) {
 curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");

 list = curl_slist_append(list, "Shoesize: 10");
 list = curl_slist_append(list, "Accept:");

 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);

 curl_easy_perform(curl);

 curl_slist_free_all(list); /* free the list again */
}

1 Ответ

0 голосов
/ 10 января 2020

Чтобы получить данные возврата из запроса curl, нам нужна функция обратного вызова для опции CURLOPT_WRITEFUNCTION. Параметры proxy, data, verify должны быть установлены следующим образом:

#include <iostream>
#include <string>
#include <curl/curl.h>

size_t curlWriter(void *contents, size_t size, size_t nmemb, std::string *s)
{
    size_t newLength = size*nmemb;
    try
    {
        s->append((char*)contents, newLength);
    }
    catch(std::bad_alloc &e)
    {
        //memory problem
        return 0;
    }
    return newLength;
}
int main()
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {
        std::string strResponse;
        std::string strPostData = "my data post";

        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/v/session");
        curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L); 

        //set the proxy
        curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxy.net");  
        curl_easy_setopt(curl, CURLOPT_PROXYPORT, 8080L);

        //verify=False. SSL checking disabled
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 


        //set the callback function
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriter);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strResponse);


        /* size of the POST data */
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strPostData.length() );

        /* pass in a pointer to the data - libcurl will not copy */
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPostData.c_str() );

        /* Execute the request */
        res = curl_easy_perform(curl);

        /* Check for errors */
        if(res != CURLE_OK)
        {
            std::cerr <<  "CURL error : " << curl_easy_strerror(res) << std::endl;
        }else {
            std::cout <<  "CURL result : " << strResponse << std::endl;
        }

        curl_easy_cleanup(curl);
    }
}
...