"_url" : "XX_RT_URL_XX/REST/2.0/queue/1"
}
]
}
This format is JSON, which is a format for which many programming languages
provide libraries for parsing and generat
TP verb (C<POST> instead of C<GET>), a C<Content-Type>
header (to tell REST2 that your content is JSON instead of, say, XML),
and the fields for your new ticket such as Subject. Here is the curl
invoc
apped to multiple lines for readability.
curl -X POST
-H "Content-Type: application/json"
-d '{ "Subject": "hello world" }'
-H 'Authorization: token XX_TOKEN_XX'
ce::Role::RequestBodyIsJSON;
use strict;
use warnings;
use MooseX::Role::Parameterized;
use namespace::autoclean;
use JSON ();
use RT::Extension::REST2::Util qw( error_as_json );
use Moose::Util::Ty
header('Content-Type') =~ /^application\/json/;
my $json = eval {
JSON::from_json($request->content)
};
if ($@ or not $json) {
my $error = $@;
rror_as_json($self->response, undef, "JSON parse error: $error");
return 1;
}
elsif (ref $json ne $P->type) {
error_as_json($self->response, undef, "JSON object
{ ['GET'] }
sub content_types_provided { [{ 'application/json' => 'to_json' }] }
sub to_json {
my $self = shift;
return JSON::to_json({
Version => $RT::VERSION,
Plugins => [
:Resource::Collection::ProcessPOSTasGET',
'RT::Extension::REST2::Resource::Collection::QueryByJSON';
sub dispatch_rules {
Path::Dispatcher::Rule::Regex->new(
regex => qr{^/searches/?$
tributes' } },
)
}
use Encode qw( decode_utf8 );
use RT::Extension::REST2::Util qw( error_as_json );
use RT::Search::Simple;
sub allowed_methods {
[ 'GET', 'HEAD', 'POST' ]
}
sub limit_coll
Extension::REST2::Resource::Collection';
with 'RT::Extension::REST2::Resource::Role::RequestBodyIsJSON' =>
{type => 'ARRAY'};
has 'user' => (
is => 'ro',
isa => 'RT::User',
);
sub dispatc
, 'HEAD', 'DELETE', 'PUT');
return \@ok;
}
sub content_types_accepted {[{'application/json' => 'from_json'}]}
sub delete_resource {
my $self = shift;
my $collection = $self->collection;
oup->DeleteMember($self->user->id);
}
return 1;
}
sub from_json {
my $self = shift;
my $params = JSON::decode_json($self->request->content);
my $user = $self->user;
my $met
E::Base64;
extends 'RT::Extension::REST2::Resource';
use RT::Extension::REST2::Util qw( error_as_json update_custom_fields update_role_members fix_custom_role_ids);
sub dispatch_rules {
Path::Di
{ [ { 'application/json' => sub {} } ] }
sub content_types_accepted { [ { 'text/plain' => 'add_message' }, { 'text/html' => 'add_message' }, { 'application/json' => 'from_json' }, { 'multipart/fo
my $json_str = $self->request->parameters->{JSON};
return error_as_json(
$self->response,
\400, "JSON is a required field for multipart/form-data")
unless $json_str;
ST2::Resource::Role::RequestBodyIsJSON' =>
{ type => 'ARRAY' };
use RT::Extension::REST2::Util qw(expand_uid);
use RT::Extension::REST2::Resource::Ticket;
use JSON ();
sub dispatch_rules {
Pat
{ 'application/json' => sub {} } ] }
sub content_types_accepted { [ { 'application/json' => 'from_json' } ] }
sub from_json {
my $self = shift;
my $params = JSON::decode_json( $self->reques
my @errors;
# Ported from RT::Extension::REST2::Resource::Message::from_json
if ( $param->{Attachments} ) {
foreach my $attachment
package RT::Extension::REST2::Util;
use strict;
use warnings;
use JSON ();
use Scalar::Util qw( blessed );
use List::MoreUtils 'uniq';
use Sub::Exporter -setup => {
exports => [qw[
looks
xpand_uid
expand_uri
serialize_record
deserialize_record
error_as_json
record_type
record_class
escape_uri
query_string
custom_f
->debug("Received unknown value via JSON for field $field: ".ref($value));
delete $data->{$field};
}
}
return $data;
}
sub error_as_json {
my $response = shift;
my
Extension::REST2::Resource::Collection';
with 'RT::Extension::REST2::Resource::Role::RequestBodyIsJSON' =>
{type => 'ARRAY'};
has 'group' => (
is => 'ro',
);
sub dispatch_rules {
Path::Di
, 'HEAD', 'DELETE', 'PUT');
return \@ok;
}
sub content_types_accepted {[{'application/json' => 'from_json'}]}
sub delete_resource {
my $self = shift;
my $collection = $self->collection;
eteMember($group_member->MemberId);
}
return 1;
}
sub from_json {
my $self = shift;
my $params = JSON::decode_json($self->request->content);
my $group = $self->group;
my $m
:Tickets' } },
)
}
use Encode qw( decode_utf8 );
use RT::Extension::REST2::Util qw( error_as_json expand_uid );
use RT::Search::Simple;
has 'query' => (
is => 'ro',
isa
elf = shift;
my ($ok, $msg) = $self->collection->FromSQL( $self->query );
return error_as_json( $self->response, 0, $msg ) unless $ok;
super();
return 1;
};
sub expand_field {
my
/json' => 'to_json' },
] }
sub to_json {
my $self = shift;
my $status = $self->search;
return $status if is_status_code($status);
return \400 unless $status;
return JSON::to_json(
s_code );
requires 'to_json';
sub process_post {
my $self = shift;
my $json = $self->to_json;
unless (is_status_code($json)) {
$self->response->body( $json );
return 1;
} else {
return $json;
}
}
1;
ackage RT::Extension::REST2::Resource::Collection::QueryByJSON;
use strict;
use warnings;
use Moose::Role;
use namespace::autoclean;
use JSON ();
with (
'RT::Extension::REST2::Resource::Collect
ion::ProcessPOSTasGET',
'RT::Extension::REST2::Resource::Role::RequestBodyIsJSON'
=> { type => 'ARRAY' },
);
requires 'collection';
has 'query' => (
is => 'ro',
isa
f->request->param('query')
: $self->request->content;
return $content ? JSON::decode_json($content) : [];
}
sub allowed_methods {
[ 'GET', 'POST' ]
}
sub searchable_fields {
::autoclean;
use RT::Extension::REST2::Util qw(expand_uid expand_uri custom_fields_for);
use JSON qw(to_json);
sub hypermedia_links {
my $self = shift;
return [ $self->_self_link, $self->_rtl
use warnings;
use Moose::Role;
use namespace::autoclean;
use JSON ();
use RT::Extension::REST2::Util qw( deserialize_record error_as_json expand_uid update_custom_fields update_role_members fix_custo
role_ids );
use List::MoreUtils 'uniq';
with 'RT::Extension::REST2::Resource::Role::RequestBodyIsJSON'
=> { type => 'HASH' };
requires 'record';
requires 'record_class';
sub post_is_create
n/json' => 'from_json'}, { 'multipart/form-data' => 'from_multipart' } ] }
sub from_multipart {
my $self = shift;
my $json_str = $self->request->parameters->{JSON};
return error_as_json(
urrent_user';
requires 'base_uri';
with 'RT::Extension::REST2::Resource::Record::WithETag';
use JSON ();
use RT::Extension::REST2::Util qw( serialize_record );
use Scalar::Util qw( blessed );
sub s
{ 'utf-8' }
sub content_types_provided { [
{ 'application/json' => 'to_json' },
] }
sub to_json {
my $self = shift;
return JSON::to_json($self->serialize, { pretty => 1 });
}
1;
;
use warnings;
use Moose;
use namespace::autoclean;
use RT::Extension::REST2::Util qw( error_as_json );
extends 'RT::Extension::REST2::Resource::Record';
with 'RT::Extension::REST2::Resource::Recor
unless ($self->record->CustomFieldObj->Type =~ /^(?:Image|Binary)$/) {
return error_as_json(
$self->response,
\400, "Only Image and Binary CustomFields can be downlo
eware::ErrorAsJSON;
use strict;
use warnings;
use base 'Plack::Middleware';
use Plack::Util;
use HTTP::Status qw(is_error status_message);
use RT::Extension::REST2::Util 'error_as_json';
sub call
ader_get($headers, 'content-type');
my $is_json = $content_type && $content_type =~ m/json/i;
if ( is_error($status_code) && !$is_json ) {
my $plack_res = Plack::Response->
CurrentUser->new;
}
# Used in Serialize to allow additional fields to be selected ala JSON API on:
# http://jsonapi.org/examples/
sub expand_field {
my $self = shift;
my $item = shift;