boost.asioとopenSSLでFourSquareAPIを使う

諸事情でFourSquareAPIを使ってデータを集める必要があったので,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;
}