2013-08-21 2 views
2

Catalyst에서 RESTful 서버를 함께 해킹하고 있습니다. 이것은 명목상 엄격한 RESTful 서비스이지만 호출자가 받아 들인 응답 유형에 대해서는별로 신경 쓰지 않고 항상 Template Toolkit에서 XML로 렌더링해야합니다. 이 뷰 클래스는 config 블록에 선이콘텐츠 유형이 지정되지 않은 경우 Catalyst 요청자 다음에보기를 렌더링하도록 Catalyst :: Controller :: REST를 강제 설정하려면 어떻게해야합니까?

sub process { 
    my ($self, $c) = @_; 
    $c->response->content_type('text/xml; charset=utf-8'); 
    $self->SUPER::process($c); 
} 

, "TEMPLATE_EXTENSION => '.tt2'" : 그래서 난 그냥 슈퍼 클래스를 콘텐츠 형식을 설정하고 호출하는 '과정'방법 (Catalyst::View::TT 기준) 내 자신의 뷰 클래스를 나는 Catalyst가 어떻게 $c->stash->{template} = 'world/view.tt2'과 같은 것을 말할 때 .tt2 확장은이 클래스를 사용해야 함을 의미한다는 것을 알고있다. 그렇지 않으면 Catalyst가 어떤 뷰 클래스를 사용하는지 어떻게 알지 못한다.

마지막 REST 컨트롤러 동작 (호출자가 수락 한 응답 유형과 일치하는 모든 serializer에 위임함) 대신 기본 REST 컨트롤러 동작을 재정의하는 대신 'RenderView'ActionClass가 있으며 대신 기본 뷰로 넘어갑니다.

.------------------------------------------------------------+-----------. 
| Action              | Time  | 
+------------------------------------------------------------+-----------+ 
| /world/begin            | 0.000123s | 
| /auto              | 0.000139s | 
| /world/world_id           | 0.268140s | 
| /world/view            | 0.259048s | 
| /world/view_end           | 0.000083s | 
| /view_end_GET            | 0.110241s | 
| /world/end             | 0.049207s | 
| -> Zoo::View::XML->process        | 0.048564s | 
'------------------------------------------------------------+-----------' 

하지만, 내 POST 요청이 돈 '내가 GET 이것을 테스트 할 때, 나는 처리 방법은 액션 체인의 끝에 나타나는 참조하고 뷰가 제대로 렌더링

sub end : ActionClass('RenderView') { }처럼 이것은 단지 보이는 t는보기를 렌더링하는 것 같습니다. 기본적으로 $c->stash->{template}을 설정했지만 415 UNSUPPORTED 오류 코드와 함께 원하는 본문 대신 Content-type unsupported... 오류 메시지가 표시됩니다. POST 요청의 액션 체인의 끝에 Zoo::View::XML->process에 대한 호출의 부족을 참고 :

.------------------------------------------------------------+-----------. 
| Action              | Time  | 
+------------------------------------------------------------+-----------+ 
| /world/begin            | 0.030158s | 
| /auto              | 0.000116s | 
| /world/world_id           | 0.001228s | 
| /world/lock            | 0.000915s | 
| /world/lock_end           | 0.000049s | 
| /lock_end_POST            | 0.809860s | 
| /world/end             | 0.000279s | 
'------------------------------------------------------------+-----------' 

더 깊이 파고, 그것은 $c->response->body이 이미 설정되어있는 경우 자동으로하는 (메시지 경고를 삽입하여), 구제 할 RenderView 행동처럼 보인다 나는 POST 요청 (내 lock_end 서브 루틴에 도달 할 때 본문이 "Content-type unsupported"오류 메시지로 설정되었지만 GET 요청 ($c->response->body은 정의되지 않은 상태 임)이 아닌 것으로 판단했습니다.

POST가 응답 유형에 대해 까다로운 이유는 누구나 알 수 있습니다. GET은 그렇지 않습니다. 요청한 컨텐트 유형 (또는 부족함)에 대해 걱정하지 않으려면 POST에 어떻게 알릴 수 있습니까? the Catalyst::Controller::REST documentation을 보면 아마도 아무 것도하지 않는 기본 디시리얼라이저를 지정해야 할 필요가있을 것 같습니다. 하지만 정확히 어떻게? 당신의 도움에 대한 감사 하라구요

.... 내 컨트롤러 클래스에 __PACKAGE__->config(default => 'text/xml'); 추가

답변

3

트릭을 할 것 같았다.

+0

'http : // search.cpan.org/~ bobtfish/Catalyst-Action-RenderView-0.16/lib/Catalyst/Action/RenderView.pm'에있는 문서는'__PACKAGE __-> config (default_view = > 'text/xml');'. –

+0

@ ViniciusJoséLatorre는 C : A : RenderView를위한 것입니다.이 질문은 C : A : REST에 있습니다. –