新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2011-04-07

[Perl]WebService::Simpleでレスポンスが文字化けしたら

XML::Simpleのパフォーマンスの話

WebService::Simpleは内部的にXML::Simpleを使っている。古い話だけど、XML::Simpleといえばこちらにもあるように「遅い」と評されることがあって、それはここに原因と対策がまとめられていて、掻い摘んで説明すると

・XML::SimpleはデフォルトでXML::SAX::PurePerlを内部的にパーサとして使用している。
・XML::SAX::PurePerl*が*遅いのであって、XML::Parserを使えば速度が改善される。

ということになる。そのためには
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
という具合に、XML::Simpleが内部的に使用するパーサにXML::Parserを指定すれば良い。

本題

のっけから脱線したけど、これはWebService::Simpleのparse_response()の結果が文字化けを起こすという現象にも、同様の事が言える模様。

use WebService::Simple;

my $ws = WebService::Simple->new(
    base_url => 'http://example.com/api',
    param => { api_key => '***' },
);

my $res = $ws->get( 'hoge/fuga', { q => 'piyo' } );
my $xml = $res->parse_response;

例えば、こんな具合で生成されたWebService::Simpleのオブジェクトがあって、parse_responseの戻り値が文字化けしていたとする。そんな時はまず、

use WebService::Simple;
use WebService::Simple::Parser::XML::Simple;

$XML::Simple::PREFERRED_PARSER = 'XML::Parser';

my $ws = WebService::Simple->new(
    base_url => 'http://example.com/api',
    param => { api_key => '***' },
    response_parser => WebService::Simple::Parser::XML::Simple->new( xs => $xs ),
);

my $res = $ws->get( 'hoge/fuga', { q => 'piyo' } );
my $xml = $res->parse_response;
この様な具合でresponse_parserを食わせてみると、文字化けが治ったりするかもしれない。

0 件のコメント: