【C++】libcurlでHTTPリクエストを投げる(2)



前回 はlibcurlの導入とGETをやった。今回はPOSTとヘッダーの設定をする。

POST

今回も httpbin.org を使わせていただく。ヘッダーでContent-Typeを指定しない場合は、 GETと同じように"param=value"といった文字列をURLエンコードし、 それらを'&'で繋いだものを送る(application/x-www-form-urlencoded形式)。

name

message



プログラム

//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_slistCURLOPT_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