简体   繁体   中英

How to rewrite POST request from python to C++ with curl

I have POST request on python with a lot of settings, and I don't uderstand how their look like in 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)

I find that url set parament CURLOPT_URL, headers - CURLOPT_HTTPHEADER. But how set proxy, verify, data ? How get json as in python ? how to complete the code that it have the same result as in 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 */
}

In order to get the return data from the curl request, we need a callback function for the CURLOPT_WRITEFUNCTION option. The proxy , data , verify parameters should be set as following :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM