読者です 読者をやめる 読者になる 読者になる

迷いませんか?

プログラミング、電子工作、ゲーム・・・etc、色々やるけど中途半端なブログです。

GETとPOSTする関数作った

プログラミング Boost C/C++

Boost.asioでHTTPSのGETとPOSTを実装出来たのでメモ

//Get request and response output
void Get(boost::asio::io_service& io_service,string host,string path){
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(host,"https");
    boost::asio::ssl::context ctx(io_service,boost::asio::ssl::context::sslv3_client);
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_stream(io_service,ctx);

    //Connect and handshake
    ssl_stream.lowest_layer().connect(*resolver.resolve(query));
    ssl_stream.handshake(boost::asio::ssl::stream_base::client);

    //---------------Create request---------------
    boost::asio::streambuf request;
    ostream req_s(&request);

    req_s << "Get " << path << " HTTP/1.1\r\n";
    req_s << "Host: " << host << "\r\n";
    req_s << "X-ChatWorkToken: /*APIトークン*/\r\n";
    req_s << "Accept: */*\r\n";
    req_s << "Connection: Close\r\n\r\n";
    //---------------------------------------------

    //Send request
    boost::asio::write(ssl_stream,request);

    //Recieve request and output
    boost::asio::streambuf response;
    boost::asio::read_until(ssl_stream,response,"\r\n");

    istream res_s(&response);
    string http_version;
    unsigned int status_code;
    string buf;

    while(getline(res_s,buf)){
        cout << buf << endl;
    }
    
    cout << endl;
}

//Post message function
void Post(boost::asio::io_service& io_service,string host,
    string path,string message,string room){
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(host,"https");
    boost::asio::ssl::context ctx(io_service,boost::asio::ssl::context::sslv3_client);
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_stream(io_service,ctx);

    //Connect and handshake
    ssl_stream.lowest_layer().connect(*resolver.resolve(query));
    ssl_stream.handshake(boost::asio::ssl::stream_base::client);

    //---------------Create request---------------
    boost::asio::streambuf request;
    ostream req_s(&request);

    req_s << "POST " << path << room << "/messages HTTP/1.1\r\n";
    req_s << "Host: " << host << "\r\n";
    req_s << "X-ChatWorkToken: /*APIトークン*/\r\n";
    req_s << "Accept: */*\r\n";
    req_s << "Content-Length: " << message.size()+5 << "\r\n";
    cout << message << endl;
    cout << "size(): " << message.size() << endl << "length(): " << message.length() << endl;
    req_s << "Content-Type: application/x-www-form-urlencoded\r\n";
    req_s << "Connection: Close\r\n";
    req_s << "\r\n";
    req_s << "body=" << message << "\r\n";
    //---------------------------------------------

    //Send request
    boost::asio::write(ssl_stream,request);

    //Recieve request and output
    boost::asio::streambuf response;
    boost::asio::read_until(ssl_stream,response,"\r\n");

    istream res_s(&response);
    string http_version;
    unsigned int status_code;
    
    res_s >> http_version;
    res_s >> status_code;

    if(status_code != 200){
        cout << "Connection Error!" << endl;
        cout << "Status code: " << status_code << endl;;
        return;
    }
}

io_serviceとかその他諸々を入れればできる。
ChatWorkクライアント用なのでAPIトークンを入れる必要がある。

色々と呪文があるけど理解してることをメモ
handshakeでSSL通信のなんだろHello!Hello!みたいな接続要求?する。
なんて便利なんでしょう!
そしてWriteでリクエストを送り、read_untilでレスポンスを受け取る。

だいたいPOSTのbody=にするところで詰まってました。

あとはGUIをつけて、
API更新でメッセージ受け取れるようになったらその機能つけてほぼ完成!

がんばっていきます。
ちなみにGUIwxWidgetsで実装します

それではサヨウナラ-