ひそやか〜に続けている社内勉強会のメモ。
(特に今回は資料もなかったので)
libcurl について
このライブラリを使うと、HTTP(s)ほかプロトコルでURLにアクセスする
プログラムを、非常に簡単に書く事ができる。
ソースコードはこちらのリポジトリ参照
http://github.com/shiumachi/curl_tut
ポイントとなるコードは以下の通り
まず、ライブラリ自体を初期化する。
この関数はThread-Safeではないので、Apacheのモジュールから使うのであれば、
child_initフックなどの初期化フェーズ(まだスレッドが作られていない)で
呼ぶ必要があるだろう。
curl_global_init(CURL_GLOBAL_SSL);
そして、これと対になるのが
curl_global_cleanup();
とりあえず、グローバルな初期化と終了処理はこの2つ。
そして、個々のURLに対するロジックの核は以下のブロック
FILE *fp = stdout; char *url = "http://www.example.com/"; CURL *curl; : curl = curl_easy_init(); curlinfo = curl_version_info(CURLVERSION_NOW); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); curl_easy_setopt(curl, CURLOPT_URL, url); res = curl_easy_perform(curl); curl_easy_cleanup(curl);
やる事は、curl_easy_init()で作成したCURLオブジェクトに、
色々オプションを指定して、最後にcurl_easy_perform()を実行する。
そうすると、この関数が指定したオプションに従って処理をしてくれる。
この場合、CURLOPT_URLで指定したURLからGETを試みて、取得したデータを
CURLOPT_WRITEDATAで指定したストリームに書き込む。
POSTメソッドの場合も非常に単純。libcurl-tutorial(3)を参照すると、
以下のような記述がある。
We provide a pointer to the data and tell libcurl to post it all to the remote site: char *data="name=daniel&project=curl"; curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, data); curl_easy_setopt(easyhandle, CURLOPT_URL, "http://posthere.com/"); curl_easy_perform(easyhandle); /* post away! */ Simple enough, huh? Since you set the POST options with the CURLOPT_POSTFIELDS, this automatically switches the handle to use POST in the upcoming request.
確かにこれは simple enough である。