やりたいこと
- 基礎(ドットインストールと「Perl言語プログラミングレッスン」)だけでは眠いので、チャレンジ的にやりたいことをやってみていることにしている。
- 今回はユースケベー氏の「Webサービスの作り方」と「Perlについて語ろう」に書いてあった「Mojolicious::Liteでtuwiiter APIつかってキーワード検索し、ツイートを表示!」ってのをやりたかった。
- 内容的に似ているので、youtube APIで試した。
- youtube APIに検索ワード決め打ちで入れて、タイトルとURLを返すところまでを実装
- そのあと、Mojolicious::Liteでそれを表示させる
- しかしここで問題が。タイトルの日本語が文字化ける
- 格闘すること4時間、解決せず。
- Perlの内部文字列がそのまま出ているのかなぁ?
#!/usr/bin/env perl
use strict;
use warnings;
use Mojolicious::Lite;
use WebService::Simple;
use utf8;
use JSON;
get '/' => sub {
my $self = shift;
my $service = WebService::Simple->new(
base_url => 'http://gdata.youtube.com/feeds/api/videos',
response_parser => 'JSON'
);
my $res = $service->get(
{ q => 'YAPC::ASIA', 'max-results' => '5', alt => 'json' } );
my $ref = $res->parse_response();
$self->stash->{youtubes} = $ref->{feed}->{entry};
$self->render('index');
};
app->start;
- とりあえず、きりがないので次に向かうことにする。
- とか言いつつ、結局気になってしまい、より書籍に書いてあったのに近づけて書いてみた。
- 具体的にはWebService::Simpleではなく、LWP::UserAgentで書いてみた。
- 日本語表示きたぁ!
#!/usr/bin/env perl
use strict;
use warnings;
use Mojolicious::Lite;
use URI;
use LWP::UserAgent;
use JSON qw/decode_json/;
use Encode;
get '/' => sub {
my $self = shift;
my $uri = URI->new("http://gdata.youtube.com/feeds/api/videos");
$uri->query_form(
q => 'YAPC::Asia',
'max-results' => '5',
alt => 'json'
);
my $ua = LWP::UserAgent->new();
my $res = $ua->get($uri);
my $data = decode_json( $res->content );
$self->stash->{youtubes} = $data->{feed}->{entry};
$self->render('index');
};
app->start;
- あー、超幸せ
- でも、なんでWebServide::Simpleのときはダメだったんだろ?
- 調子に乗って調べるというか、二つのスクリプトの違いをみてみた。
- レスポンスで帰ってくるときのJSONの処理かなぁ・・・?
- WebService::Simpleのparse_response()ではなく、JSONモジュールのdecode_jsonつかったらうまくいったー!
- でも、なんでparse_response()でダメだったんだろ?
#!/usr/bin/env perl
use strict;
use warnings;
use Mojolicious::Lite;
use WebService::Simple;
use JSON qw/decode_json/;
get '/' => sub {
my $self = shift;
my $service = WebService::Simple->new(
base_url => 'http://gdata.youtube.com/feeds/api/videos',
response_parser => 'JSON'
);
my $res = $service->get(
{ q => 'YAPC::ASIA', 'max-results' => '5', alt => 'json' } );
my $data = decode_json($res->content);
$self->stash->{youtubes} = $data->{feed}->{entry};
$self->render('index');
};
app->start;