X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController%2FREST.pm;h=090284ee2110937da0cf145ae4dd307b44726d78;hb=355d4385698315db0f6f1e253836292fecd3b05b;hp=e1de5ff835a0126ebe87ea6a1b5e4740ab9f39bf;hpb=92d78e8fd6588988c74af7cd84647714fa883912;p=catagits%2FCatalyst-Action-REST.git diff --git a/lib/Catalyst/Controller/REST.pm b/lib/Catalyst/Controller/REST.pm index e1de5ff..090284e 100644 --- a/lib/Catalyst/Controller/REST.pm +++ b/lib/Catalyst/Controller/REST.pm @@ -2,7 +2,7 @@ package Catalyst::Controller::REST; use Moose; use namespace::autoclean; -our $VERSION = '0.82'; +our $VERSION = '0.87'; $VERSION = eval $VERSION; =head1 NAME @@ -146,6 +146,12 @@ Uses L to generate JSON output. It is strongly advised to also have L installed. The C content type is supported but is deprecated and you will receive warnings in your log. +You can also add a hash in your controller config to pass options to the json object. +For instance, to relax permissions when deserializing input, add: + __PACKAGE__->config( + json_options => { relaxed => 1 } + ) + =item * C => C If a callback=? parameter is passed, this returns javascript in the form of: $callback($serializedJSON); @@ -277,9 +283,6 @@ __PACKAGE__->config( 'text/x-yaml' => 'YAML', 'application/json' => 'JSON', 'text/x-json' => 'JSON', - 'application/x-javascript' => 'JSONP', - 'application/javascript' => 'JSONP', - 'text/javascript' => 'JSONP', 'text/x-data-dumper' => [ 'Data::Serializer', 'Data::Dumper' ], 'text/x-data-denter' => [ 'Data::Serializer', 'Data::Denter' ], 'text/x-data-taxi' => [ 'Data::Serializer', 'Data::Taxi' ], @@ -401,6 +404,36 @@ sub status_no_content { return 1.; } +=item status_multiple_choices + +Returns a "300 MULTIPLE CHOICES" response. Takes an "entity" to serialize, which should +provide list of possible locations. Also takes optional "location" for preferred choice. + +=cut + +sub status_multiple_choices { + my $self = shift; + my $c = shift; + my %p = Params::Validate::validate( + @_, + { + entity => 1, + location => { type => SCALAR | OBJECT, optional => 1 }, + }, + ); + + my $location; + if ( ref( $p{'location'} ) ) { + $location = $p{'location'}->as_string; + } else { + $location = $p{'location'}; + } + $c->response->status(300); + $c->response->header( 'Location' => $location ) if exists $p{'location'}; + $self->_set_entity( $c, $p{'entity'} ); + return 1; +} + =item status_bad_request Returns a "400 BAD REQUEST" response. Takes a "message" argument @@ -514,9 +547,6 @@ This class provides a default configuration for Serialization. It is currently: 'text/x-yaml' => 'YAML', 'application/json' => 'JSON', 'text/x-json' => 'JSON', - 'application/x-javascript' => 'JSONP', - 'application/javascript' => 'JSONP', - 'text/javascript' => 'JSONP', 'text/x-data-dumper' => [ 'Data::Serializer', 'Data::Dumper' ], 'text/x-data-denter' => [ 'Data::Serializer', 'Data::Denter' ], 'text/x-data-taxi' => [ 'Data::Serializer', 'Data::Taxi' ], @@ -535,28 +565,33 @@ L. The C method uses L. The C method uses L. If you want to override either behavior, simply implement your own C and C actions -and use MRO::Compat: +and forward to another action with the Serialize and/or Deserialize +action classes: package Foo::Controller::Monkey; use Moose; use namespace::autoclean; - + BEGIN { extends 'Catalyst::Controller::REST' } - sub begin :Private { + sub begin : Private { my ($self, $c) = @_; ... do things before Deserializing ... - $self->maybe::next::method($c); + $c->forward('deserialize'); ... do things after Deserializing ... } + sub deserialize : ActionClass('Deserialize') {} + sub end :Private { my ($self, $c) = @_; ... do things before Serializing ... - $self->maybe::next::method($c); + $c->forward('serialize'); ... do things after Serializing ... } + sub serialize : ActionClass('Serialize') {} + =back =head1 A MILD WARNING