我正在使用Catalyst来构建RESTful Web服务,因此我以通常的方式创建了一个Catalyst控制器
script/myapp_create.pl controller MyApp::Controller
然后我启动催化剂测试服务器
script/zoo_server.pl -rd
到目前为止一切顺利 – 我现在可以访问http:// localhost:3000 / user并看到消息“在用户中匹配MyApp :: Controller :: User”.
然后我用下面的行替换lib / MyApp / Controller / User.pm中的第一个BEGIN行
BEGIN { extends 'Catalyst::Controller::REST' }
在做任何其他事情之前,我想检查一下我执行POST请求并观察响应的能力.所以在另一个终端窗口,我输入
curl http://localhost:3000/user --verbose --data "<test><m>whatever</m></test>" -H "Content-Type: text/xml"
此时,由于我没有实现任何POST方法,我希望看到“405 Method Not Allowed”响应.相反,我从卷曲中看到的是:
* About to connect() to localhost port 3000 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 3000 (#0)
> POST /user HTTP/1.1
> User-Agent: curl/7.19.6 (i386-apple-darwin10.0.0) libcurl/7.19.6 zlib/1.2.5
> Host: localhost:3000
> Accept: */*
> Content-Type: text/xml
> Content-Length: 28
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
* Closing connection #0
然后这似乎崩溃催化剂的测试服务器.服务器不记录任何内容,但将来尝试联系服务器,例如对“localhost:3000 / user”执行另一个GET请求,导致curl“无法连接到主机”错误.
我注意到,只有在我使用Catalyst :: Controller :: REST时才会发生这种情况.如果我只是制作一个普通的控制器,POST它就不会崩溃.所以我假设它发生在反序列化操作上,它将被委托给XML :: Simple(根据Catalyst :: Controller :: REST的默认值).有任何想法吗?
顺便说一下,我最终想做的是创建一个类似子事的方法:Local:ActionClass(‘REST’)…,以及相应的子thing_POST.我的理解是,在调用thing_POST之前,对包含XML的/ user / thing的POST请求应该自动反序列化并将其放入$c-> request->数据中.以上测试是初步的 – 旨在检查如果没有定义POST方法会发生什么. (对于它的价值,如果我创建sub thing和sub thing_POST,然后使用curl向/ user / thing发出POST请求,我会得到完全相同的行为.)
最佳答案 我最终将其追溯到XML :: SAX.可重现的错误情况:
% cat >! test
<test><a>blah</a></test>
% perl -e 'use XML::SAX;my $sp = XML::SAX::ParserFactory->parser;my $tree = $sp->parse_uri("test")'
Segmentation fault
请注意,如果引用XML而不是在文件中,它可以正常工作:
% perl -e 'use XML::SAX;my $sp = XML::SAX::ParserFactory->parser;my $tree = $sp->parse_string("<a><b>test</b></a>");print $tree'
HASH(0x1009c4470)
我想我的XML :: SAX安装有问题.