【C++】libcurlでHTTPリクエストを投げる(1)
C++でHTTPリクエストをしたい
と、ぼくは思った。なんでわざわざC++で、ってぼくでも思うけど。
Pythonとかならrequestsで簡単にできるのに。
さて、「C++ httpリクエスト」とかGoogle検索すると、
cpprestsdk
なるものが真っ先に候補に出てくる。なるほど、天下のマイクロソフトが作っているのか。
これは心強い。ふむふむなるほど、vcpkgでインストールできるのか。
そしてどうやらWindowsではVisual Studioが必要らしい。VScodeは持ってるけどVSは無い。終わり。
・・・(´・ω・` )
まだ終わらない。ソースからビルドしよう。Boostが必要らしい。有名なあれか、入れよう。
zipで200MBあるぞ、でかい、やめよう。やっぱり終わり。
・・・・・・(´・ω:;.:…
libcurlを使う
そしてたどり着いたのがlibcurlである。文字通りcURLのCライブラリ。C++というかなんならC言語だけど。
日本語情報も少なめだけどちゃんとあるのでありがたい。
入手
curl公式からzipをダウンロードする
curl - Download
Windowsは一番下にある。自分はWindows64bitのthe curl projectのを使った。
ダウンロードしたzipを解凍すると中にinclude,lib,binのフォルダがあるので、それぞれ中身を適切な場所に配置する。
libとincludeはプログラムを書いてコンパイルするときに必要になる。
binの中にあるdllファイルは生成した実行ファイルを動かすときに必要なので、
PATHが通っている場所か実行ファイルと同じ場所に配置する。
自分はcurl.exeと一緒にC:\Windows\System32\に置いた。
プログラム
テスト用に
httpbin.org
が便利なので、ここにGETを送ってみる。
https://httpbin.org/get?name=hoge&message=hello%2C+world%21
//sample1.cpp
#include<curl/curl.h>
#include<iostream>
#include<string>
size_t callback(char* ptr,size_t size,size_t nmemb,std::string* stream){
size_t s=size*nmemb;
stream->append(ptr,s);
return s;
}
int main(){
CURL *curl;
CURLcode curlCode;
std::string res="";
const char url[]="https://httpbin.org/get?name=hoge&message=hello%2C+world%21";
curl=curl_easy_init();
//本来ならここでnullチェックをしたほうが良い?
curl_easy_setopt(curl, CURLOPT_URL,url);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0); //証明書の確認をしない
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&res);
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;
}
callbackの第4引数はvoid*で書いてる情報が多かったけど、このコードでもちゃんと動いた。
CURLOPT_SSL_VERIFYPEER
を0に指定しないと、CA証明書が無いって怒られてしまった。
コンパイル
g++ -I {path to include} -L {path to lib} sample1.cpp -lcurl -lcurldll -o sample1.exe
実行結果
{
"args": {
"message": "hello, world!",
"name": "hoge"
},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-61eceddd-7d7c49180a83e699028b3d1e"
},
"origin": "AAA.BBB.CCC.DDD",
"url": "https://httpbin.org/get?name=hoge&message=hello%2C+world!"
}
ちゃんと通信できた。次回はPOSTとヘッダーの設定をしてみる。
参考
C++でlibcurlを利用したHTTPクライアント libcurl公式チュートリアルを和訳してまとめていく Windowsでlibcurlを使う(MinGW)
#C++ #libcurl #HTTP
投稿日時 : 2022/01/23 16:25