1 package Catalyst::Request::REST;
5 use namespace::autoclean;
7 extends 'Catalyst::Request';
8 with 'Catalyst::TraitFor::Request::REST';
10 # Please don't take this as a recommended way to do things.
11 # The code below is grotty, badly factored and mostly here for back
13 sub _insert_self_into {
14 my ($class, $app_class ) = @_;
15 # the fallback to $app_class is for the (rare and deprecated) case when
16 # people are defining actions in MyApp.pm instead of in a controller.
17 my $app = (blessed($app_class) && $app_class->can('_application'))
18 ? $app_class->_application : Catalyst::Utils::class2appclass( $app_class ) || $app_class;
20 my $req_class = $app->request_class;
21 return if $req_class->isa($class);
22 my $req_class_meta = Moose->init_meta( for_class => $req_class );
23 return if $req_class_meta->does_role('Catalyst::TraitFor::Request::REST');
24 if ($req_class eq 'Catalyst::Request') {
25 $app->request_class($class);
28 my $meta = Moose::Meta::Class->create_anon_class(
29 superclasses => [$req_class],
30 roles => ['Catalyst::TraitFor::Request::REST'],
33 $meta->add_method(meta => sub { $meta });
34 $app->request_class($meta->name);
38 __PACKAGE__->meta->make_immutable;
43 Catalyst::Request::REST - A REST-y subclass of Catalyst::Request
47 if ( $c->request->accepts('application/json') ) {
51 my $types = $c->request->accepted_content_types();
55 This is a subclass of C<Catalyst::Request> that adds a few methods to
56 the request object to faciliate writing REST-y code. Currently, these
57 methods are all related to the content types accepted by the client.
59 Note that if you have a custom request class in your application, and it does
60 not inherit from C<Catalyst::Request::REST>, your application will fail with an
61 error indicating a conflict the first time it tries to use
62 C<Catalyst::Request::REST>'s functionality. To fix this error, make sure your
63 custom request class inherits from C<Catalyst::Request::REST>.
71 If the request went through the Deserializer action, this method will
72 return the deserialized data structure.
74 =item accepted_content_types
76 Returns an array reference of content types accepted by the
79 The list of types is created by looking at the following sources:
83 =item * Content-type header
85 If this exists, this will always be the first type in the list.
87 =item * content-type parameter
89 If the request is a GET request and there is a "content-type"
90 parameter in the query string, this will come before any types in the
95 This will be parsed and the types found will be ordered by the
96 relative quality specified for each type.
100 If a type appears in more than one of these places, it is ordered based on
101 where it is first found.
103 =item preferred_content_type
105 This returns the first content type found. It is shorthand for:
107 $request->accepted_content_types->[0]
111 Given a content type, this returns true if the type is accepted.
113 Note that this does not do any wildcard expansion of types.
119 See L<Catalyst::Action::REST> for authors.
123 You may distribute this code under the same terms as Perl itself.