2011-05-13 28 views
4

我使用的催化劑構建一個RESTful Web服務,所以我創建以通常的方式一臺Catalyst控制器爲什麼curl POST請求會崩潰我的Catalyst :: Controller :: REST控制器?

script/myapp_create.pl controller MyApp::Controller 

然後我火了催化劑測試服務器

script/zoo_server.pl -rd 

到目前爲止好 - 我現在可以去http://localhost:3000/user並看到消息「Matched MyApp :: Controller :: User in User」。

我然後用下面一行

BEGIN { extends 'Catalyst::Controller::REST' } 

替換的lib/MyApp的/控制器/ User.pm第一BEGIN行做別的任何事情之前,我想檢查我的執行POST請求和手錶的能力響應。因此,在另一個終端窗口,I型

curl http://localhost:3000/user --verbose --data "<test><m>whatever</m></test>" -H "Content-Type: text/xml" 

在這一點上,因爲我還沒有實現任何POST方法,我期待看到一個「405不允許的方法」的迴應。相反,我從捲曲中看到的是:

* 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時纔會發生這種情況。如果我只是建立一個常規控制器,發佈它並不會導致任何事情崩潰。所以我假設它發生在反序列化操作上,它將被委託給XML :: Simple(按照Catalyst :: Controller :: REST的默認設置)。有任何想法嗎?

我最終想要做的,順便說一句,是創建一個方法,如sub thing :Local :ActionClass('REST') ...,和相應的sub thing_POST。我的理解是POST請求包含XML的/ user/thing應該自動得到反序列化並將其放入$c->request->data,然後調用thing_POST。上述測試對此是初步的 - 設計用於檢查如果 POST方法被定義會發生什麼。 (對於它的價值,我得到完全相同的行爲,如果我創建sub thingsub thing_POST,然後使用curl發出POST請求/用戶/東西。)

回答

0

你已經爲你的行動事情有:本地屬性附加,這意味着被調度的路徑是/ user/thing(而不是你將數據發佈到/ user)。也許你想檢查Catalyst Manual - Action Types introduction

或者,如果你仍然遇到一些問題,你可以試試在官方#catalyst irc頻道詢問。

+0

非常感謝,特別是對於IRC技巧。事實上,正如我現在通過編輯問題所闡明的,如果我發佈到/ user/thing,我會得到相同的行爲。我所看到的似乎是(curl生成的)POST請求崩潰在Catalyst :: Controller :: REST對象中定義的任何操作的一般傾向。發佈到/ user仍然會產生這種效果(由於默認的'index'動作),但是發佈到一個未定義的控制器(例如'/ user/feck/off')不會(我會得到一個「not found」錯誤)。只有REST控制器才能完成。所以我在想我的設置中有些東西壞了。 – user751842 2011-05-13 17:27:46

+0

好吧,我已經試過irc.perl.org上的#catalyst,到目前爲止的震耳欲聾的沉默...似乎沒有人在那裏。從另一方面來說,我所展示的代碼在我的另一臺機器上工作正常,這表明這可能是某種安裝/配置困境。 – user751842 2011-05-14 16:41:22

+0

#催化劑救援......他們實際上對v有幫助 – user751842 2011-05-14 17:54:33

2

我最終將其追溯到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安裝,我猜。

+2

而且,實際上,它似乎是一個libxml2版本問題:它在2.7.5及更高版本上運行正常,故障診斷版本爲2.7.3。非常感謝#catalyst和stackexchange的幫助! – user751842 2011-05-14 18:20:38

相關問題