Test::Mojo post_ok 没有正确读入 POST 数据
Test::Mojo post_ok not reading in POST data correctly
我正在创建一个简单的 Mojolicious 应用程序,它将成为我数据库中某些 object 的 REST API。我正在尝试创建一个新的 object,但是 POST 将数据发送到 object collection。这是我的 Test::Mojo 脚本的基本结构:
use Mojo::Base -strict;
use Test::More;
use Test::Mojo;
use strict;
use warnings;
my $ip_node = {ipname => 'ip_alias.subdomain.company.com', ipservice => 'reserved', ipaddress => '192.168.0.1'};
my $t = Test::Mojo->new('Tools');
$t->post_ok('/tools/ipadmin/nodes' => {Accept => 'application/json'} => form => $ip_node)->status_is(201);
done_testing();
但无论出于何种原因,Mojo 控制器在以上述方式发送时无法读取 POST 数据。为了调试它,在我的控制器中,我有以下几行来响应请求:
my $c = shift;
print "All params: " . $c->req->params . "\n";
print "IP Name: " . $c->req->param("ipname") . "\n";
print "IP Service: " . $c->req->param("ipservice") . "\n";
print "IP Address: " . $c->req->param("ipaddress") . "\n";
当我运行通过证明测试脚本时:
$ prove -v -I /path/to/workspace/Tools/lib t/basic.t
输出在这三个输出之一之间变化。大多数时候,所有 4 个打印语句都是空的,但偶尔会有 CRLF + POST 数据(最后两个字符被剥离,可能是因为 CRLF 吃掉了 content_length),甚至更少HTTP Headers 的 content_length 得到输出。
All params: %0D%0Aipaddress=192.168.0.1&ipname=ip_alias.subdomain.company.com&ipservice=reserv
IP Name: ip_alias.subdomain.company.com
IP Service: reserv
IP Address:
All params: User-Agent%3A+Mojolicious+%28Perl%29%0D%0AHost%3A+127.0.0.1%3A35611%0D%0AAccept-Encoding%3A+gzip%0D%0A=
IP Name:
IP Service:
IP Address:
All params:
IP Name:
IP Service:
IP Address:
有人见过这种行为吗?我的 post_ok 语法有问题吗?我已经阅读了 Test::Mojo 的 Mojo 文档,看起来(对我来说)这应该可以工作,但实际上没有。有什么想法吗?
谢谢!
事实证明,此行为是我的 cookie 上传递给控制器的杂散换行符的结果。我正在为 authn/authz 创建一个 Cookie Jar 并将其附加到 mojo object 上:
my $jar = Mojo::UserAgent::CookieJar->new;
$jar->add(
Mojo::Cookie::Response->new(
name => "$mojo_cookie_name",
value => "$cookie_data",
domain => "127.0.0.1",
path => "$mojo_cookie_path"
)
);
$t->{ua}->{cookie_jar} = $jar;
但是 $cookie_data 上面有一个额外的换行符。通过在将 $cookie_data 添加到 Cookie Jar 之前对 $cookie_data 执行 chomp() ,一切都按预期进行。我不知道为什么当 cookie 上有一个额外的换行符时,Mojo 请求会如此失败 - 我认为如果任何手册 header 上也有一个额外的换行符,它也会失败。如果有任何进一步的结果,我将 updated/comment 相应地回答这个问题。
我正在创建一个简单的 Mojolicious 应用程序,它将成为我数据库中某些 object 的 REST API。我正在尝试创建一个新的 object,但是 POST 将数据发送到 object collection。这是我的 Test::Mojo 脚本的基本结构:
use Mojo::Base -strict;
use Test::More;
use Test::Mojo;
use strict;
use warnings;
my $ip_node = {ipname => 'ip_alias.subdomain.company.com', ipservice => 'reserved', ipaddress => '192.168.0.1'};
my $t = Test::Mojo->new('Tools');
$t->post_ok('/tools/ipadmin/nodes' => {Accept => 'application/json'} => form => $ip_node)->status_is(201);
done_testing();
但无论出于何种原因,Mojo 控制器在以上述方式发送时无法读取 POST 数据。为了调试它,在我的控制器中,我有以下几行来响应请求:
my $c = shift;
print "All params: " . $c->req->params . "\n";
print "IP Name: " . $c->req->param("ipname") . "\n";
print "IP Service: " . $c->req->param("ipservice") . "\n";
print "IP Address: " . $c->req->param("ipaddress") . "\n";
当我运行通过证明测试脚本时:
$ prove -v -I /path/to/workspace/Tools/lib t/basic.t
输出在这三个输出之一之间变化。大多数时候,所有 4 个打印语句都是空的,但偶尔会有 CRLF + POST 数据(最后两个字符被剥离,可能是因为 CRLF 吃掉了 content_length),甚至更少HTTP Headers 的 content_length 得到输出。
All params: %0D%0Aipaddress=192.168.0.1&ipname=ip_alias.subdomain.company.com&ipservice=reserv
IP Name: ip_alias.subdomain.company.com
IP Service: reserv
IP Address:
All params: User-Agent%3A+Mojolicious+%28Perl%29%0D%0AHost%3A+127.0.0.1%3A35611%0D%0AAccept-Encoding%3A+gzip%0D%0A=
IP Name:
IP Service:
IP Address:
All params:
IP Name:
IP Service:
IP Address:
有人见过这种行为吗?我的 post_ok 语法有问题吗?我已经阅读了 Test::Mojo 的 Mojo 文档,看起来(对我来说)这应该可以工作,但实际上没有。有什么想法吗?
谢谢!
事实证明,此行为是我的 cookie 上传递给控制器的杂散换行符的结果。我正在为 authn/authz 创建一个 Cookie Jar 并将其附加到 mojo object 上:
my $jar = Mojo::UserAgent::CookieJar->new;
$jar->add(
Mojo::Cookie::Response->new(
name => "$mojo_cookie_name",
value => "$cookie_data",
domain => "127.0.0.1",
path => "$mojo_cookie_path"
)
);
$t->{ua}->{cookie_jar} = $jar;
但是 $cookie_data 上面有一个额外的换行符。通过在将 $cookie_data 添加到 Cookie Jar 之前对 $cookie_data 执行 chomp() ,一切都按预期进行。我不知道为什么当 cookie 上有一个额外的换行符时,Mojo 请求会如此失败 - 我认为如果任何手册 header 上也有一个额外的换行符,它也会失败。如果有任何进一步的结果,我将 updated/comment 相应地回答这个问题。