2011-05-13 3 views
4

나는 RESTful 웹 서비스를 구축하는 촉매를 사용하고, 그래서 일반적인 방법으로 촉매 컨트롤러를 만들왜 curl POST 요청이 Catalyst :: Controller :: REST 컨트롤러와 충돌합니까?

script/myapp_create.pl controller MyApp::Controller 

그때 나는 지금까지 이렇게 좋은 촉매 테스트 서버

script/zoo_server.pl -rd 

를 불 - 이제 http://localhost:3000/user으로 가서 "일치하는 MyApp :: Controller :: User in User"메시지를 볼 수 있습니다.

난 후 다른 작업을 수행하기 전에 다음 줄

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

와 lib 디렉토리/MyApp를/컨트롤러/User.pm의 첫 번째 BEGIN 라인을 대체

, 나는 POST 요청 및 시계를 실행하기 위해 내 능력을 확인하려면 응답. 다른 터미널 창에서 그래서, 나는 내가 어떤 POST 메소드를 구현하지 않은 이후, 나는 응답에 "허용되지 않음 (405) 방법"을 참조하십시오 기대하고,이 시점에서

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

을 입력합니다. 그 대신에 내가 뒤에서 볼 수있는 것은 다음과 같습니다.

* 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를 통해 아무 것도 충돌하지 않습니다. 그래서 deserialization 액션에서 XML : :: Simple (Catalyst :: Controller :: REST의 기본값에 따라)이 위임 될 것이라고 가정합니다. 어떤 아이디어?

결국 내가하고 싶은 것은 sub thing :Local :ActionClass('REST') ...과 같은 방법을 만들고 이에 해당하는 sub thing_POST을 작성하는 것입니다. 내 이해는 XML을 포함하는/user/thing에 대한 POST 요청을 thing_POST을 호출하기 전에 자동으로 deserialize하여 $c->request->data에 넣어야한다는 것입니다. 위의 테스트는 이것에 대한 예비 테스트입니다. 이 아니고 POST 메소드가 정의 된 경우 어떻게되는지 확인하도록 설계되었습니다. (그것은 가치가 무엇을 위해, 나는/사용자/일에 POST 요청을 발행 컬 사용 후 내가 sub thingsub thing_POST 만들 경우 정확히 같은 동작을 얻을합니다.)

답변

0

당신은 당신의 행동 을 정의했습니다 : 로컬 속성이 첨부되어 있습니다. 즉, 전달되는 경로는/user/thing입니다 (대신에/user에 데이터를 게시하는 경우). Catalyst Manual - Action Types introduction

그래도 문제가 발생하면 공식 #catalyst irc 채널을 사용해보십시오.

+0

감사합니다. 특히 IRC 팁입니다. 사실, 지금 내가 질문을 편집하여 명확히 했으므로/user/thing에 게시하면 동일한 동작을 얻습니다. 내가보고있는 것은 Catalyst (Controller) :: Controller :: REST 객체에 정의 된 모든 동작을 중단시키는 (컬 생성 된) POST 요청의 일반적인 경향 인 것으로 보입니다./user에 게시하면 여전히이 효과가 발생하지만 (기본 'index' 액션으로 인해), 정의되지 않은 컨트롤러 (예 :'/ user/feck/off')에 게시하면 않습니다 (대신 "찾을 수 없음"오류가 발생합니다). 그리고 REST 컨트롤러 만 작동합니다. 그래서 나는 내 설정에서 무언가가 망가 졌다고 생각하고 있습니다. – user751842

+0

좋아요, 나는 irc.perl.org에서 #catalyst를 시도해 봤습니다. 지금까지 멍청한 멍청이에게 ... 아무도 거기에없는 것 같습니다. 플러스 측면에서 필자가 보여준 코드는 제 다른 컴퓨터에서 잘 작동합니다. 이는 설치/구성 오류 일 수 있음을 암시합니다. – user751842

+0

#catalyst가 구조되었습니다 ... 실제로는 도움이되었습니다 – user751842

2

결국 XML :: SAX로 추적했습니다. 재현 버그 조건 : XML이 인용되면 오히려 파일에보다 잘 작동한다는

% 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 :: SAX 설치 문제

% 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) 

뭔가 것 같아요.

+2

실제로 libxml2 버전 문제인 것으로 보입니다 : 버전 2.7.5 이상에서는 잘 작동하며 버그가있는 버전은 2.7.3입니다. #catalyst 및 stackexchange 덕분에 많은 도움을 받았습니다. – user751842

관련 문제