Declaration
template <class Socket> class basic_http : public Socket; typedef basic_http<tcp::socket> http;
Overview
http は,指定したホスト名 + パス名に HTTP リクエストを送信して内容を取得するためのクラスです. get() メソッド,および post() メソッドはそれぞれ GET,POST リクエストに対応しています. 取得された内容は,ステータスコード,ヘッダ,本文に分割して記憶します.ユーザは,それぞれ code(),head(),body() メソッドで結果を取得することができます.
Example
#include <iostream> #include "clx/http.h" #include "clx/uri.h" int main(int argc, char* argv[]) { if (argc < 3) return -1; try { clx::http session(clx::uri::encode(argv[1]), 80); session.get(clx::uri::encode(argv[2])); std::cout << "code: " << session.code() << std::endl; std::cout << std::endl; std::cout << "head" << std::endl; std::cout << "--" << std::endl; for (clx::http::head_iterator pos = session.head().begin(); pos != session.head().end(); pos++) { std::cout << pos->first << ": " << pos->second << std::endl; } std::cout << std::endl; std::cout << "body" << std::endl; std::cout << "--" << std::endl; std::cout << session.body() << std::endl; } catch (clx::socket_error& e) { std::cerr << e.what() << std::endl; std::exit(-1); } return 0; }
Result $ ./test clx.cielquis.net /index.html code: 200 head -- Accept-Ranges: bytes Connection: close Content-Length: 14775 Content-Type: text/html Date: Fri, 29 Aug 2008 06:14:21 GMT ETag: "c5fe8e-39b7-48b704e8" Last-Modified: Thu, 28 Aug 2008 20:04:56 GMT Server: Apache body -- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta name="author" content="clown"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel="index" href="index.html"> <link rel="stylesheet" href="style/default.css" type="text/css"> ・・・(以下略)・・・
Template Parameters
- Socket
- ソケットクラスを指定します.
Related Types
typedef char char_type; typedef std::basic_string<char_type> string_type; typedef std::map<string_type, string_type> head_type; typedef typename head_type::iterator head_iterator; typedef typename head_type::const_iterator const_head_iterator;
Construction and Member Functions
basic_http(); explicit basic_http(const socket_type& cp); explicit basic_http(const string_type& host, int port = 80); explicit basic_http(const char_type* host, int port = 80); virtual ~basic_http(); basic_http& start(const string_type& host, int port = 80); basic_http& start(const char_type* host, int port = 80); void finish(); basic_http& request(const string_type& query); basic_http& request(const char_type* query); bool response(double timeout = -1.0);
start() メソッドで指定したホストと接続を試みます.request() メソッドは, 引数として指定された文字列を接続したサーバへ送信します.response() メソッドは, request() メソッドで送信した HTTP リクエストに対する応答を受信し,内部変数に記憶します. timeout に0以上の値を指定すると,timeout 秒経過しても応答がない場合 false を返して終了します.
bool head(const string_type& path, const head_type& head = head_type(), double timeout = -1.0); bool head(const char_type* path, const head_type& head = head_type(), double timeout = -1.0); bool get(const string_type& path, const head_type& head = head_type(), double timeout = -1.0); bool get(const char_type* path, const head_type& head = head_type(), double timeout = -1.0); bool post(const string_type& path, const string_type& data, const head_type& head = head_type(), double timeout = -1.0); bool post(const char_type* path, const char_type* data, const head_type& head = head_type(), double timeout = -1.0);
head(),get(),および post() メソッドは,path で指定された Web ページの内容を取得するための HTTP リクエストを作成した後,request(),response() メソッドを自動的に呼び出します.これらのメソッドは head を指定した場合, 送信する HTTP リクエストに指定されたヘッダ情報を付加します.head は [ヘッダ名,内容] の std::map<std::string, std::string> 形式で指定して下さい.尚, デフォルトの状態では,head(),get() メソッドは Host ヘッダ,pos() メソッドは Host,および Content-Length ヘッダを付加します.
int code() const; const string_type& message() const; const head_type& head() const; head_type& head(); const string_type& body() const;
response() メソッドで取得した内容にアクセスするためのメソッド群です.それぞれ, ステータスコード,ステータスコードに対応する文字列,ヘッダ情報,本文を取得します.
double& version(); double version() const;
HTTP バージョンの内容を設定/取得するためのメソッドです. get(),post() メソッドは,ここで設定された値を基に HTTP リクエストを作成します.