2014-07-13 36 views
4

我嘗試使用SymfonyFOSRestBundle(1.3版)以htmljson格式(我也希望最終允許使用xml)同時提供內容。我已經成功地服務於使用_format參數路線不同的內容,例如:如何使用Symfony 2和FOSRestBundle從同一路線提供HTML和JSON請求,以及_format?

  • /foo.json將導致一個JSON響應,
  • /foo將導致HTML的響應。

有沒有辦法調和(在同一主機上!),使用比_format其他東西,例如Content-TypeAccept頭相同內容的談判?

我看過Format Listener,但我認爲我對如何配置它有一個基本的誤解。


鑑於定義路線:

<route id="foo" pattern="/foo.{_format}" methods="GET"> 
    <default key="_controller">FooBundle:Foo:get</default> 
    <default key="_format">html</default> 
</route> 

...以下動作:

public function getAction(Request $request) 
{ 
    $view = View::create() 
     ->setData(array('greeting' => 'hello world')) 
     ->setFormat($request->getRequestFormat('html')) 
     ->setTemplate('FooBundle:Foo:get.html.twig'); 
    return $this->get('fos_rest.view_handler')->handle($view); 
} 

...和以下FOSRestBundle配置(片斷):

fos_rest: 
    ... 
    format_listener: true 

我需要指定t如果我想以非默認格式(html)的格式協商內容,請參閱請求中的_format參數,如上所述。

但是,如果我指定的格式監聽下列規則:

fos_rest: 
    format_listener: 
    rules: 
     - { path: '^/', priorities: ['json'], fallback_format: ~, prefer_extension: false } 
     - { path: '^/', priorities: ['html', '*/*'], fallback_format: html, prefer_extension: true } 

瀏覽器請求返回我的答覆爲Content-Type: application/json,但實際內容是text/html內容,而不是序列化JSON。如果我明確指定Accept標頭,但請求爲Accept: text/html,我收到的響應的內容類型標頭爲Content-Type: text/html

任何幫助將不勝感激!

回答

1

如果您希望基於Content-type標頭的內容協商,則需要BodyListener而不是FormatListener。 閱讀documentation

+0

謝謝,我通過Body Listener(實際上是整個頁面)多次閱讀,但無論出於何種原因,當我第一次閱讀它從未點擊過的那部分內容類型時, –

+0

鏈接已死亡... – Trix

相關問題