我有一个ajax请求和一个调用Catalyst控制器的测试。如何让params出现在Catalyst对象的同一个地方?

时间:2011-12-12 21:16:20

标签: perl catalyst

测试中的片段:

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 :(得分:0)

我不完全确定,但我怀疑jQuery会将您在Ajax请求中发送的数据附加到GET查询字符串。我怀疑的一部分是我不知道你的Ajax片段中.serializeObject()做了什么。

您可以查看有关dataprocessData选项的documentation,看看是否有帮助。

以下是相关部分:

  

数据   要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。请参阅processData选项以防止此自动处理。对象必须是键/值对。如果value是一个数组,jQuery会根据传统设置的值使用相同的键序列化多个值(如下所述)。

     

...

     

<强>过程数据   默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型“application / x-www-form-urlencoded” 。如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。

答案 1 :(得分:0)

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