4

SymfonyFOSRestBundle (ver. 1.3)を使用して、 と の両方htmlの形式でコンテンツを提供しようとしていjsonます (最終的にxmlは同様に許可したいと考えています)。パラメータを使用してルートのさまざまなコンテンツを提供することに成功しました。_format

  • /foo.jsonJSON レスポンスが返されます。
  • /fooHTML 応答が返されます。

またはヘッダー_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

_format上記のように、ネゴシエートされたコンテンツをデフォルト ( ) 以外の形式で必要とする場合は、要求でパラメーターを指定する必要がありますhtml

ただし、フォーマット リスナーに次のルールを指定すると、次のようになります。

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

ブラウザのリクエストはレスポンスを as として返しますContent-Type: application/jsonが、実際のコンテンツはtext/htmlシリアル化された JSON ではなくコンテンツです。Acceptリクエストでヘッダーを明示的に指定すると、Accept: text/html受け取った応答のコンテンツ タイプ ヘッダーはContent-Type: text/html.

どんな助けでも大歓迎です!

4

1 に答える 1

1

Content-type ヘッダーに基づくコンテンツ ネゴシエーションが必要な場合は、FormatListener の代わりに BodyListener が必要です。ドキュメントを読んでください。

于 2014-07-14T06:45:50.267 に答える