У меня есть запрос ajax и тест, вызывающий контроллер Catalyst.Как заставить параметры отображаться в одном и том же месте объекта Catalyst? - PullRequest
2 голосов
/ 13 декабря 2011

Фрагмент из теста:

my $request = HTTP::Request->new( POST => 'http://192.168.5.130:3000/user' );
$request->content_type('application/json');
$request->content( $query_string );
my $result = $ua->request( $request );

Фрагмент из вызова ajax:

$.ajax({
    url: 'http://192.168.5.130:3000/user',
    type: 'POST',
    cache: false,
    async: true,
    dataType: 'json',
    timeout: 5000,
    data: $("#create-user-form").serializeObject(),
    error: function(jqXHR, textStatus, errorThrown){
    console.log("jQuery ajax error....");
},
); 

В контроллере есть обработчик маршрута (с использованием Catalyst::Controller::Rest)

sub user_POST {
        my ($self, $c, $args) = @_;
    warn Dumper( $c );

...
 }

Проблема, с которой я сталкиваюсь, заключается в том, что когда я выполняю вызов из теста, содержимое устанавливается в объекте Catalyst в хеш-ключе с ключом «data», к которому можно получить доступ, вызывая $c->req->data.

Однако, когда ajax-вызов выполняется с веб-страницы, данные хранятся в объекте Catalyst в хеше с ключом, называемым « parameters », доступ к которому осуществляется с помощью вызова $c->req->parameters.

Кто-нибудь знает, почему это происходит и что нужно делать, чтобы обойти это?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2012

Catalyst хранит ввод в двух разных местах. Строковые параметры запроса доступны в

$c->request->query_params

и параметры кузова доступны в

$c->request->body_params

Чтобы получить весь ввод, используйте

$c->request->params

Из документации модуля Catalyst :: Controller :: REST:

The HTTP POST, PUT, and OPTIONS methods will all automatically deserialize the
contents of $c->request->body into the $c->request->data hashref
0 голосов
/ 13 декабря 2011

Я не совсем уверен, но я подозреваю, что jQuery добавляет данные, которые вы отправляете в запросе Ajax, в строку запроса GET.Отчасти я сомневаюсь, что я не знаю, что делает .serializeObject() в вашем фрагменте Ajax.

Вы можете проверить документацию относительно параметров data и processData и посмотреть, поможет ли это.

Вот соответствующие разделы:

данные Данные для отправки на сервер.Он преобразуется в строку запроса, если это еще не строка.Он добавляется в URL для GET-запросов.См. Параметр processData, чтобы предотвратить эту автоматическую обработку.Объект должен быть парой ключ / значение.Если значение является массивом, jQuery сериализует несколько значений с одним и тем же ключом на основе значения традиционного параметра (описанного ниже).

...

processData По умолчаниюданные, переданные в параметр данных как объект (технически, что угодно, кроме строки), будут обработаны и преобразованы в строку запроса, соответствующую типу содержимого по умолчанию «application / x-www-form-urlencoded».Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

...