【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