boost.asioとopenSSLでFourSquareAPIを使う
諸事情でFourSquareのAPIを使ってデータを集める必要があったので,boost.asioとopenSSLを使ってAPIを叩くコードを書きました.
これは4sqのoAuthを使ったAPIの規定がそうなっているからです.http通信でAPIを要求するとhttpsを通してくれ、という内容のjsonが帰ってきます.
openSSLを使うには別途サイトからDLするなりWindowsならインストーラを落としてくるなどする必要があります.私の環境では64bitOSなのに64bit版はうまく動きませんでした(未解決シンボルエラー. ただし32bit版はうまく動いた).
- コードについて
Google検索して出てきたページをいくつか参考にしたのと,大方letsBoostさんのページのasioサンプルと一緒です(前に書いたGoogle検索コードと大体同じ).
モジュール化する際は上のstring変数を引数として設定するつもりで,とりあえずプロトタイプを作りました.
#include <iostream> #include <string> #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> //これが無いとダメっぽい #pragma comment(lib, "libeay32MDd.lib") #pragma comment(lib, "ssleay32MDd.lib") int main() { const std::string uri = "api.foursquare.com"; const std::string oauth_token = "********"; const std::string host = "api.foursquare.com"; const std::string api_request = "/v2/users/self"; boost::asio::io_service io_service; boost::asio::ssl::context context( io_service, boost::asio::ssl::context::sslv3_client ); boost::asio::ssl::stream< boost::asio::ip::tcp::socket > ssl_stream( io_service, context ); //resolveを使ってサイトが存在するのか確認、そして接続 ssl_stream.lowest_layer().connect( * boost::asio::ip::tcp::resolver( io_service ).resolve\ ( boost::asio::ip::tcp::resolver::query( uri, "https" ) ) ); ssl_stream.handshake( boost::asio::ssl::stream_base::client ); //requestを作成する------------------------------- boost::asio::streambuf request; std::ostream request_stream( & request ); request_stream << "GET /" << api_request << "?oauth_token=" << oauth_token << " HTTP/1.0\r\n"; request_stream << "Host: " << host << "\r\n"; request_stream << "\r\n"; //------------------------------------------------ //リクエストの送信 boost::asio::write( ssl_stream, request ); //リクエストの受信と表示 boost::asio::streambuf res; boost::system::error_code error; while( boost::asio::read( ssl_stream, res, boost::asio::transfer_at_least(1), error ) ) std::cout << & res; std::cout << std::endl; return 0; }