OSS開発勉強会-08 (前半)

ひそやか〜に続けている社内勉強会のメモ。
(特に今回は資料もなかったので)

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 である。