加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Test :: Mojo post_ok无法正确读取POST数据

发布时间:2020-12-16 06:12:25 所属栏目:大数据 来源:网络整理
导读:我正在创建一个简单的Mojolicious应用程序,它是我数据库中某些对象的REST API.我试图测试创建一个新对象,但将数据POST到对象集合.这是我的Test :: Mojo脚本的基本结构: use Mojo::Base -strict;use Test::More;use Test::Mojo;use strict;use warnings;my $
我正在创建一个简单的Mojolicious应用程序,它是我数据库中某些对象的REST API.我试图测试创建一个新对象,但将数据POST到对象集合.这是我的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语法有问题吗?我已经阅读了测试:: Mojo的Mojo文档,看起来(对我来说)这应该可以工作,但事实并非如此.有任何想法吗?

谢谢!

解决方法

事实证明,这种行为是我的cookie上传递给Controller的一个离线换行符的结果.我创建了一个用于authn / authz的Cookie Jar并将其附加到mojo对象上:

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上执行chomp(),然后将其添加到Cookie Jar上,一切都按预期工作.当cookie上有一个额外的新行字符时,我不知道为什么Mojo请求如此惊人地失败 – 我认为如果任何手动标题上还有一个额外的新行字符,它将会失败.如果有任何进一步的结果,我会相应地更新/评论这个答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读