WebService::Simple

YAPC::Asia 2008 Lightning Talks

yusukebe / wadit Inc.
yusuke (at) kamawada.com / yusukebe.com

My first CPAN module

WebService::Simple

SYNOPSIS

Simple Interface to
Web Services APIs

Example: POX over HTTP

POX て何だという話をちょっと前に書きましたが。yohei さん曰く、いわゆる "GET で XML 返し" してるだけで REST みたいな、誤用されてる API のアーキテクチャ(?)は "POX over HTTP" と呼べばよいとのこと。

POX over HTTP - naoyaのはてなダイアリー

Example: Many WebService APIs

Yahoo Google YouTube flickr Amazon lingr 楽天 CarSensor 価格.com HotPepper 食べログ.com ...

Flickr echo sample

use WebService::Simple;
use Data::Dumper;

my $flickr = WebService::Simple->new(
    base_url => "http://api.flickr.com/services/rest/",
    param    => { api_key => "your_api_key", }
);

my $response =
  $flickr->get( { method => "flickr.test.echo", name => "value" } );
my $ref = $response->parse_response;
print Dumper $ref;
  

How and Why

If using WebService API by Perl

Case: Flickr API

Some CPAN modules

Writing original codes

I wrote the same code often

  1. make the request url to API
  2. fetch the response from API includes contents ( XML, JSON etc. )
  3. perse the content to use ( by XML::Simple etc. )

So I make
WebService::Simple

Interface to any(?)
WebService APIs

use WebService::Simple

1. make the instance

use WebService::Simple;
my $flickr = WebService::Simple->new(
    base_url => "http://api.flickr.com/services/rest/",
    param    => { api_key => "your_api_key", }
);
   

2. get the response

my $response = $flickr->get(
    {
        method => "flickr.photos.search",
        text   => "cat",
    }
);

3. parse the content

# $ref is hash ref
# parsed with XML::Simple
my $ref = $response->parse_response;
  

Other features

Cache the response

my $cache = Cache::File->new(
             cache_root      => '/tmp/mycache',
             default_expires => '30 min',
         );

my $flickr = WebService::Simple->new(
             base_url => "http://api.flickr.com/services/rest/",
             cache    => $cache,
             param    => { api_key => "your_api_key, },
         );
  

Choose a parser

my $flickr = WebService::Simple->new(
    base_url        => "http://api.flickr.com/services/rest/",
    response_parser => 'JSON',
    params          => { api_key => "your_api_key", format => "json" }
);
  

Make subclass

package WebService::Simple::Flickr;

use base qw(WebService::Simple);
__PACKAGE__->config( base_url => "http://api.flickr.com/services/rest/", );

sub photos_search {
    my ( $self, $str ) = @_;
    return $self->get(
        {
            method => "flickr.photos.search",
            text   => $str
        }
    );
}
  

Make subclass

use WebService::Simple::Flickr;

my $flickr =
  WebService::Simple::Flickr->new(
     param => { api_key => "your_api_key", } );

my $ref = $flickr->photos_search("cat")->parse_response;
  

Development at CodeRepos

Rewrote my code
by lestrrat and tokuhirom

diff
http://coderepos.org/share/changeset/10071

thanks to
lestrrat and tokuhirom

Conclusion

If interest in WebService::Simple, please use it.

CodeRepos ++;

thanks!!