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

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

本文关键字:python 重写 C++ 请求 何使用 curl POST      更新时间:2023-10-16

我在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 */
}

为了从 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);
}
}