【C++】libcurlでHTTPリクエストを投げる(2)
前回
はlibcurlの導入とGETをやった。今回はPOSTとヘッダーの設定をする。
POST
今回も
httpbin.org
を使わせていただく。ヘッダーでContent-Typeを指定しない場合は、
GETと同じように"param=value"といった文字列をURLエンコードし、
それらを'&'で繋いだものを送る(application/x-www-form-urlencoded形式)。
プログラム
//sample2.cpp
#include<iostream>
#include<string>
#include<curl/curl.h>
size_t callback(char* ptr,size_t size,size_t nmemb,std::string* stream){
size_t s=size*nmemb;
stream->reserve(s);
stream->append(ptr,s);
return s;
}
int main(){
CURL* curl;
std::string res;
CURLcode curlCode;
std::string data="name=hoge&message=hello%2C+world%21";
curl=curl_easy_init();
//nullチェック略
curl_easy_setopt(curl, CURLOPT_URL,"https://httpbin.org/post");
curl_easy_setopt(curl, CURLOPT_POST,1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.length());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&res);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0);
curlCode = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if(curlCode==CURLE_OK){
std::cout << res << std::endl;
}else{
std::cout << "curl error " << curlCode << std::endl;
}
return 0;
}
実行結果
{
"args": {},
"data": "",
"files": {},
"form": {
"message": "hello, world!",
"name": "hoge"
},
"headers": {
"Accept": "*/*",
"Content-Length": "35",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-61efbd9f-1da51ddd7e630ff3780deae6"
},
"json": null,
"origin": "AAA.BBB.CCC.DDD",
"url": "https://httpbin.org/post"
}
ヘッダーを設定する
struct curl_slist
とCURLOPT_HTTPHEADER
を使ってヘッダーを設定することができる。
今回はContent-Typeをapplication/jsonにしてJSON形式でデータを送る。
また、User-Agentも設定してみる。
プログラム
//sample3.cpp
#include<iostream>
#include<string>
#include<curl/curl.h>
size_t callback(char* ptr,size_t size,size_t nmemb,std::string* stream){
size_t s=size*nmemb;
stream->reserve(s);
stream->append(ptr,s);
return s;
}
int main(){
CURL* curl;
std::string res;
CURLcode curlCode;
struct curl_slist* header=NULL;
header=curl_slist_append(header,"Content-Type: application/json");
header=curl_slist_append(header,"User-Agent: curl/7.79.1");
std::string data="{\"name\":\"hoge\",\"message\":\"hello, world!\"}";
curl=curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL,"https://httpbin.org/post");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
curl_easy_setopt(curl, CURLOPT_POST,1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.length());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&res);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0);
curlCode = curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_slist_free_all(header);
if(curlCode==CURLE_OK){
std::cout << res << std::endl;
}else{
std::cout << "curl error " << curlCode << std::endl;
}
return 0;
}
実行結果
{
"args": {},
"data": "{\"name\":\"hoge\",\"message\":\"hello, world!\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.79.1",
"X-Amzn-Trace-Id": "Root=1-61efc708-37daed8a3b74bd0373a2ef40"
},
"json": {
"message": "hello, world!",
"name": "hoge"
},
"origin": "AAA:BBB:CCC:DDD",
"url": "https://httpbin.org/post"
}
#C++ #libcurl #HTTP
投稿日時 : 2022/01/25 19:22