リクエストURIを構築する
URIエスケープ
いよいよPerlを使ってWeb APIを利用していくわけですが、
URIの仕様では、
たとえばTwitter Search APIで
http://search.twitter.com/search.json?q=おはよう
と日本語を直接入れてはいけません。次のようにURIエスケープする必要があります。
http://search.twitter.com/search.json?q=%E3%81%8A%E3%
81%AF%E3%82%88%E3%81%86
Perlでクエリの名前と値の連結や、
モジュールのインストール
URIモジュールの使い方の説明の前に、
これからURIモジュールを含めいくつかのモジュールを解説していきますが、
Can't locate URI.pm in @INC ...
モジュールのインストールは、
CPANシェルの場合、
cpan > install URI
とすればインストールが行われます。
App::cpanminusでは、
$ cpanm URI
とすればインストールが行われます。
モジュールをどこの場所にインストールするかはいろいろと議論があるので、--sudo
オプションを付けて実行し、
URIモジュールを使う
では、
Twitter Search APIから
use URI;
use utf8;
my $query = 'おはよう';
my $uri =
URI->new('http://search.twitter.com/search.json');
my $params = {
q => $query,
result_type => 'popular',
};
$uri->query_form(%$params);
print "$uri\n";
result_
出力は次のようになります。
$ perl uri.pl
http://search.twitter.com/search.json?result_type=popu
lar&q=%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86
query_
URI::Escapeモジュール
ちなみに、
use URI::Escape qw( uri_escape_utf8 );
use utf8;
my $qeury = 'おはよう';
print uri_escape_utf8( $query ) . "\n";
上記では、
Web APIにリクエストする
URIモジュールによって作成したURI
LWP::UserAgentモジュール
今回はLWP::UserAgentモジュールを使いWeb APIへアクセスしてみます。LWP::UserAgentはWeb APIへのアクセスのみならず、
LWP::UserAgentことはじめ
Webページのタイトルを取得するコード
Twitter Search APIへアクセスしたい気持ちを抑えつつ、
use URI;
use LWP::UserAgent;
my $uri = URI->new('http://gihyo.jp/');
my $ua = LWP::UserAgent->new(); …(1)
my $res = $ua->get( $uri ); …(2)
die $res->status_line if $res->is_error; …(3)
my ($title) = $res->content
=~ m!<title>(.+?)</title>!i; …(4)
print "$title\n";
このスクリプトを実行すると、
GETメソッドによるリクエスト/レスポンス処理の基本
my $ua = LWP::UserAgent->new( agent => 'wpcrawler',
timeout => 30 );
getメソッドにURI文字列やURIオブジェクトを渡すと、
ここで出てきたHTTP::Responseはその名のとおりHTTPのレスポンスを汎用的に扱えるような一般的なモジュールです。もちろんHTTP::Requestというモジュールもあり、
HTTP::Responseオブジェクトのis_
また、200 OK
」404 Not Found
」
もしレスポンスがエラーを返さなかった場合には、
ここまでがLWP::UserAgentの最低限の使い方ですが、
結果をパースする
Twitter Search APIのレスポンスは、
JSONモジュール
JSONフォーマットを解析するにはJSON::XSモジュールやJSON::PPモジュールを使うのが一般的です。今回紹介するのはJSONモジュールなのですが、
JSONテキストからの変換
ここでは、
- user:yusukebe
- message:おはよう
JSONにおける日本語文字列は、
以下は、
use JSON qw( decode_json );
use Encode qw( encode_utf8 );
my $json_text =
'{"user":"yusukebe","message":"\u304a\u306f\u3088\u3046"}';
my $ref = decode_json($json_text);
print encode_utf8("$ref->{user} : $ref->{message}\n");
JSONモジュールのdecode_
# 実行結果
yusukebe : おはよう
JSONテキストへの変換
ちなみに、
use JSON;
use utf8;
my $json = JSON->new; …(1)
$json->ascii(1); …(2)
my $json_text =
$json->encode({ user => 'yusukebe', message => "おはよう" });
print "$json_text\n";
今回は先述した日本語などの
これでJSONのdecode/
# 実行結果
{"user":"yusukebe","message":"\u304a\u306f\u3088\u3046"}