如何使用curl将POST请求从python重写为C ++

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

我对python有很多设置的POST请求,但我不理解它们在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)

我发现该网址设置了参数CURLOPT_URL,标题-CURLOPT_HTTPHEADER。但是如何设置代理,验证和数据呢?如何在python中获取json?如何完成与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 */
}
c++ curl python-requests http-post
1个回答
0
投票

为了从curl请求中获取返回数据,我们需要CURLOPT_WRITEFUNCTION选项的回调函数。proxydataverify参数应设置如下:

#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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.