diff -ur Flickr-API-0.09/lib/Flickr/API/Response.pm Flickr-API-0.09-json/lib/Flickr/API/Response.pm --- Flickr-API-0.09/lib/Flickr/API/Response.pm 2005-07-11 22:30:05.000000000 +0100 +++ Flickr-API-0.09-json/lib/Flickr/API/Response.pm 2008-05-26 20:35:38.000000000 +0100 @@ -37,6 +37,12 @@ $self->{tree} = $tree; } +sub set_ok_json { + my ($self, $obj) = @_; + $self->{success} = 1; + $self->{obj} = $obj; +} + 1; __END__ diff -ur Flickr-API-0.09/lib/Flickr/API.pm Flickr-API-0.09-json/lib/Flickr/API.pm --- Flickr-API-0.09/lib/Flickr/API.pm 2008-02-05 18:00:53.000000000 +0000 +++ Flickr-API-0.09-json/lib/Flickr/API.pm 2008-05-26 20:41:37.000000000 +0100 @@ -4,6 +4,7 @@ use warnings; use LWP::UserAgent; use XML::Parser::Lite::Tree; +use JSON::Any; use Flickr::API::Request; use Flickr::API::Response; use Digest::MD5 qw(md5_hex); @@ -82,9 +83,13 @@ sub execute_request { my ($self, $request) = @_; + my $format = $request->{api_args}->{'format'} || "xml"; + $request->{api_args}->{method} = $request->{api_method}; $request->{api_args}->{api_key} = $self->{api_key}; + $request->{api_args}->{nojsoncallback} = 1 if $format eq 'json'; + if (defined($self->{api_secret}) && length($self->{api_secret})){ $request->{api_args}->{api_sig} = $self->sign_args($request->{api_args}); @@ -102,32 +107,63 @@ return $response; } - my $tree = XML::Parser::Lite::Tree::instance()->parse($response->decoded_content()); - - my $rsp_node = $self->_find_tag($tree->{children}); - - if ($rsp_node->{name} ne 'rsp'){ - $response->set_fail(0, "API returned an invalid response"); - return $response; - } - - if ($rsp_node->{attributes}->{stat} eq 'fail'){ - my $fail_node = $self->_find_tag($rsp_node->{children}); - if ($fail_node->{name} eq 'err'){ - $response->set_fail($fail_node->{attributes}->{code}, $fail_node->{attributes}->{msg}); - }else{ - $response->set_fail(0, "Method failed but returned no error code"); - } - return $response; - } + if ($format ne 'json') { + my $tree = XML::Parser::Lite::Tree::instance()->parse($response->decoded_content()); + + print $response->decoded_content()."\n\n"; + my $rsp_node = $self->_find_tag($tree->{children}); + + if ($rsp_node->{name} ne 'rsp'){ + $response->set_fail(0, "API returned an invalid response"); + return $response; + } + + if ($rsp_node->{attributes}->{stat} eq 'fail'){ + my $fail_node = $self->_find_tag($rsp_node->{children}); + if ($fail_node->{name} eq 'err'){ + $response->set_fail($fail_node->{attributes}->{code}, $fail_node->{attributes}->{msg}); + }else{ + $response->set_fail(0, "Method failed but returned no error code"); + } + return $response; + } + + if ($rsp_node->{attributes}->{stat} eq 'ok'){ + $response->set_ok($rsp_node); + return $response; + } + + $response->set_fail(0, "API returned an invalid status code"); + return $response; - if ($rsp_node->{attributes}->{stat} eq 'ok'){ - $response->set_ok($rsp_node); - return $response; - } + } else { + my $j = JSON::Any->new; + print $response->decoded_content()."\n\n"; + my $obj = $j->from_json($response->decoded_content()); + + if (!$obj){ + $response->set_fail(0, "API returned an invalid response"); + return $response; + } + + if ($obj->{stat} eq 'fail'){ + if ($obj->{code}){ + $response->set_fail($obj->{code}, $obj->{message}); + }else{ + $response->set_fail(0, "Method failed but returned no error code"); + } + return $response; + } + + if ($obj->{stat} eq 'ok'){ + $response->set_ok_json($obj); + return $response; + } + + $response->set_fail(0, "API returned an invalid status code"); + return $response; + } - $response->set_fail(0, "API returned an invalid status code"); - return $response; } sub _find_tag { diff -ur Flickr-API-0.09/test.pl Flickr-API-0.09-json/test.pl --- Flickr-API-0.09/test.pl 2006-03-19 20:17:14.000000000 +0000 +++ Flickr-API-0.09-json/test.pl 2008-05-26 20:26:12.000000000 +0100 @@ -1,5 +1,5 @@ use Test::More; -BEGIN { plan tests => 17 }; +BEGIN { plan tests => 18 }; BEGIN { use_ok( 'Flickr::API' ); } @@ -85,3 +85,20 @@ ok(!defined $uri, "Checking URL generation without a secret"); +################################################## +# +# repeat tests using the JSON format +# + +my $rsp = $api->execute_method('fake.method', {'format' => 'json'}); + + +################################################## +# +# check we get the 'method not found' error +# + +# this error code will change in future! +is($rsp->{error_code}, 112, 'checking the error code for "method not found" via JSON'); + +# "code was $rsp->{error_code}, msg was $rsp->{error_message}\n";