Amon2
view release on metacpan or search on metacpan
lib/Amon2/Plugin/Web/JSON.pm view on Meta::CPAN
=head1 METHODS
=over 4
=item C<< $c->render_json(\%dat); >>
Generate JSON data from C<< \%dat >> and returns instance of L<Plack::Response>.
=back
=head1 PARAMETERS
=over 4
=item status_code_field
It specify the field name of JSON to be embedded in the 'X-API-Status' header.
Default is C<< undef >>. If you set the C<< undef >> to disable this 'X-API-Status' header.
__PACKAGE__->load_plugins(
'Web::JSON' => { status_code_field => 'status' }
);
...
$c->render_json({ status => 200, message => 'ok' })
# send response header 'X-API-Status: 200'
In general JSON API error code embed in a JSON by JSON API Response body.
But can not be logging the error code of JSON for the access log of a general Web Servers.
You can possible by using the 'X-API-Status' header.
=item canonical
If canonical parameter is true, then this plugin will output JSON objects by sorting their keys.
This is adding a comparatively high overhead.
__PACKAGE__->load_plugins(
'Web::JSON' => { canonical => 1 }
);
...
$c->render_json({ b => 1, c => 1, a => 1 });
# json response is '{ "a" : 1, "b" : 1, "c" : 1 }'
=back
=head1 FAQ
=over 4
=item How can I use JSONP?
You can use JSONP by using L<Plack::Middleware::JSONP>.
=back
=head1 JSON and security
=over 4
=item Browse the JSON files directly.
This module escapes '<', '>', and '+' characters by "\uXXXX" form. Browser don't detects the JSON as HTML.
And also this module outputs C<< X-Content-Type-Options: nosniff >> header for IEs.
It's good enough, I hope.
=item JSON Hijacking
Latest browsers doesn't have a JSON hijacking issue(I hope). __defineSetter__ or UTF-7 attack was resolved by browsers.
But Firefox<=3.0.x and Android phones have issue on Array constructor, see L<http://d.hatena.ne.jp/ockeghem/20110907/p1>.
Firefox<=3.0.x was outdated. Web application developers doesn't need to add work-around for it, see L<http://en.wikipedia.org/wiki/Firefox#Version_release_table>.
L<Amon2::Plugin::Web::JSON> have a JSON hijacking detection feature. Amon2::Plugin::Web::JSON returns "403 Forbidden" response if following pattern request.
=over 4
=item The request have 'Cookie' header.
=item The request doesn't have 'X-Requested-With' header.
=item The request contains /android/i string in 'User-Agent' header.
=item Request method is 'GET'
=back
=back
See also the L<hasegawayosuke's article(Japanese)|http://www.atmarkit.co.jp/fcoding/articles/webapp/05/webapp05a.html>.
=head1 FAQ
=over 4
=item HOW DO YOU CHANGE THE HTTP STATUS CODE FOR JSON?
render_json method returns instance of Plack::Response. You can modify the response object.
Here is a example code:
get '/' => sub {
my $c = shift;
if (-f '/tmp/maintenance') {
my $res = $c->render_json({err => 'Under maintenance'});
$res->status(503);
return $res;
}
return $c->render_json({err => undef});
};
=back
=head1 THANKS TO
hasegawayosuke
( run in 0.654 second using v1.01-cache-2.11-cpan-13bb782fe5a )