| 14 | | my $opt = ref $_[0] eq 'HASH' ? shift: {@_}; |
| 15 | | croak "paramater base_url is required" unless $opt->{base_url}; |
| 16 | | my $self = bless { |
| 17 | | ua => LWP::UserAgent->new, |
| 18 | | %$opt, |
| 19 | | }, $class; |
| 20 | | $self; |
| | 21 | my %args = @_; |
| | 22 | my $base_url = delete $args{base_url} || |
| | 23 | $class->config->{base_url} || |
| | 24 | Carp::croak("base_url is required"); |
| | 25 | my $basic_params = delete $args{params} || {}; |
| | 26 | my $response_parser = delete $args{response_parser}; |
| | 27 | if (! $response_parser) { |
| | 28 | my $config = $class->config->{response_parser}; |
| | 29 | if (! ref $config) { |
| | 30 | $config = { module => $config }; |
| | 31 | } |
| | 32 | my $module = $config->{module}; |
| | 33 | if ($module !~ s/^\+//) { |
| | 34 | $module = __PACKAGE__ . "::Parser::$module"; |
| | 35 | } |
| | 36 | $module->require or die; |
| | 37 | $response_parser = $module->new( %{ $config->{args} || {} } ); |
| | 38 | }; |
| | 39 | die if $@; |
| | 40 | |
| | 41 | my $self = $class->SUPER::new(%args); |
| | 42 | $self->{base_url} = URI->new($base_url); |
| | 43 | $self->{basic_params} = $basic_params; |
| | 44 | $self->{response_parser} = $response_parser; |
| | 45 | return $self; |
| 23 | | sub get { |
| 24 | | my ($self, $request_param, $opt) = @_; |
| 25 | | my $url = $self->_make_url($request_param, $opt->{path}); |
| 26 | | my $response = $self->_fetch_url($url); |
| | 48 | sub base_url { $_[0]->{base_url} } |
| | 49 | sub basic_params { $_[0]->{basic_params} } |
| | 50 | sub response_parser { $_[0]->{response_parser} } |
| | 51 | |
| | 52 | sub get |
| | 53 | { |
| | 54 | my $self = shift; |
| | 55 | my ($url, %extra, @headers); |
| | 56 | if (ref $_[0] eq 'HASH') { |
| | 57 | %extra = %{shift @_}; |
| | 58 | } else { |
| | 59 | $url = shift @_; |
| | 60 | if (ref $_[0] eq 'HASH') { |
| | 61 | %extra = %{ shift @_ } |
| | 62 | } |
| | 63 | } |
| | 64 | |
| | 65 | @headers = @_; |
| | 66 | |
| | 67 | my $uri = URI->new($self->base_url); |
| | 68 | $uri->path( $uri->path . $url) if $url; |
| | 69 | |
| | 70 | # The url must be initialized with default parameters. |
| | 71 | |
| | 72 | $uri->query_form( %{$self->basic_params}, %extra ); |
| | 73 | my $response = $self->SUPER::get($uri, @headers); |
| | 74 | if (! $response->is_success) { |
| | 75 | Carp::croak("request to $url failed"); |
| | 76 | } |
| | 77 | # まだできてない |
| | 78 | # WebService::Simple::Response->new_from_response( |
| | 79 | # response => $response, |
| | 80 | # parser => $self->reponse_parser |
| | 81 | # ); |
| 30 | | sub _fetch_url{ |
| 31 | | my ($self, $url) = @_; |
| 32 | | my $response; |
| 33 | | if(exists $self->{cache}){ |
| 34 | | $response = $self->{cache}->thaw($url); |
| 35 | | if(defined $response){ |
| 36 | | return $response; |
| 37 | | } |
| 38 | | } |
| 39 | | $response = $self->{ua}->get($url); |
| 40 | | croak "can't get the request" unless $response->is_success; |
| 41 | | if(exists $self->{cache}) { |
| 42 | | $self->{cache}->freeze($url, $response); |
| | 85 | # まだできてない。 |
| | 86 | sub post |
| | 87 | { |
| | 88 | my ($self, $url, @params) = @_; |
| | 89 | |
| | 90 | # default parameters must come *before* @params, so unshift instead |
| | 91 | # of push |
| | 92 | unshift @params, %{ $self->basic_params }; |
| | 93 | my $response = $self->SUPER::post($url, @params ); |
| | 94 | |
| | 95 | if (! $response->is_success) { |
| | 96 | Carp::croak("request to $url failed"); |
| 47 | | sub _make_url{ |
| 48 | | my ($self, $request_param, $path) = @_; |
| 49 | | my $base_url = $self->{base_url}; |
| 50 | | if($path){ |
| 51 | | $path =~ s!^/+!! if $base_url =~ m{/$}; |
| 52 | | $base_url = $base_url . $path; |
| 53 | | } |
| 54 | | my $url = $base_url =~ /\?$/ ? $base_url : $base_url . "?"; |
| 55 | | my @params; |
| 56 | | push(@params, $self->_hashref_to_str($self->{param})); |
| 57 | | push(@params, $self->_hashref_to_str($request_param)); |
| 58 | | my $str = join("&", @params); |
| 59 | | return $url . $str; |
| 60 | | } |
| | 101 | 1; |
| 90 | | my $flickr = WebService::Simple->new( |
| 91 | | base_url => "http://api.flickr.com/services/rest/", |
| 92 | | param => { api_key => "your_api_key", } |
| | 113 | # Simple use case |
| | 114 | my $flickr = WebService::Simple->new( |
| | 115 | base_url => "http://api.flickr.com/services/rest/", |
| | 116 | param => { api_key => "your_api_key", } |
| | 117 | ); |
| | 118 | |
| | 119 | # send GET request to |
| | 120 | # http://api.flickr.com/service/rest/?api_key=your_api_key&method=flickr.test.echo&name=value |
| | 121 | $flickr->get( { method => "flickr.test.echo", name => "value" } ); |
| | 122 | |
| | 123 | # send GET request to |
| | 124 | # http://api.flickr.com/service/rest/extra/path?api_key=your_api_key&method=flickr.test.echo&name=value |
| | 125 | $flickr->get( "extra/path", |
| | 126 | { method => "flickr.test.echo", name => "value" }); |
| | 127 | |
| | 128 | # Create a subclass - Encapsulates things better |
| | 129 | package WebService::Simple::Flickr; |
| | 130 | use base qw(WebService::Simple); |
| | 131 | __PACKAGE__->config( |
| | 132 | base_url => "http://api.flickr.com/services/rest/", |
| | 133 | upload_url => "http://api.flickr.com/services/upload/", |
| | 134 | ); |
| | 135 | |
| | 136 | sub test_echo |
| | 137 | { |
| | 138 | my $self = shift; |
| | 139 | $self->get( { method => "flickr.test.echo", name => "value" } ); |
| | 140 | } |
| | 141 | |
| | 142 | sub upload |
| | 143 | { |
| | 144 | my $self = shift; |
| | 145 | local $self->{base_url} = $self->config->{upload_url}; |
| | 146 | $self->post( |
| | 147 | Content_Type => "form-data", |
| | 148 | Content => { title => "title", description => "...", photo => ... }, |
| 101 | | WebService::Simple provides you a simple interface to Web Services APIs |
| 102 | | |
| 103 | | =head1 METHODS |
| 104 | | |
| 105 | | =over 4 |
| 106 | | |
| 107 | | =item new(I<%args>) |
| 108 | | |
| 109 | | my $flickr = WebService::Simple->new( |
| 110 | | base_url => "http://api.flickr.com/services/rest/", |
| 111 | | param => { api_key => "your_api_key", } |
| 112 | | ); |
| 113 | | |
| 114 | | Create and return a new WebService::Simple object. |
| 115 | | "new" Method requires a base_url of Web Service API. |
| 116 | | |
| 117 | | =item get(I<%args>) |
| 118 | | |
| 119 | | my $response = |
| 120 | | $flickr->get( { method => "flickr.test.echo", name => "value" } ); |
| 121 | | |
| 122 | | Get the WebService::Simple::Response object. |
| 123 | | |
| 124 | | If you want to add a path to base URL, use an option parameter. |
| 125 | | |
| 126 | | my $lingr = WebService::Simple->new( |
| 127 | | base_url => "http://www.lingr.com/", |
| 128 | | param => { api_key => "your_api_key", format => "xml" } |
| 129 | | ); |
| 130 | | my $response = $lingr->get( {}, { path => "/api/session/create" } ); |
| 131 | | |
| 132 | | =back |
| 133 | | |
| 134 | | =head1 CACHING |
| 135 | | |
| 136 | | Cache the response of Web Service APIs by using Cache object. |
| 137 | | Here's an example. |
| 138 | | |
| 139 | | my $cache = Cache::File->new( |
| 140 | | cache_root => "/tmp/mycache", |
| 141 | | default_expires => "30 min", |
| 142 | | ); |
| 143 | | |
| 144 | | my $flickr = WebService::Simple->new( |
| 145 | | base_url => "http://api.flickr.com/services/rest/", |
| 146 | | cache => $cache, |
| 147 | | param => { api_key => $api_key, } |
| 148 | | ); |
| 149 | | |
| 150 | | |
| 151 | | =head1 AUTHOR |
| 152 | | |
| 153 | | Yusuke Wada C<< <yusuke@kamawada.com> >> |
| 154 | | |
| 155 | | =head1 COPYRIGHT AND LICENSE |
| 156 | | |
| 157 | | Copyright (c) 2008 Yusuke Wada, All rights reserved. |
| 158 | | |
| 159 | | This module is free software; you can redistribute it |
| 160 | | and/or modify it under the same terms as Perl itself. |
| 161 | | See L<perlartistic>. |
| 162 | | |
| | 159 | =cut |