4

我正在尝试使用SymfonyhtmlFOSRestBundle(1.3 版)以两种json格式提供内容(我也希望最终也允许)。我已经成功地使用参数为路线提供不同的内容,例如:xml_format

  • /foo.json将导致 JSON 响应,
  • /foo会产生一个 HTML 响应。

有没有办法使用除 之外的东西来协调(在同一主机上!)上面的相同内容协商_format,例如Content-TypeorAccept标头?

我查看了格式侦听器,但我认为我对如何配置它有一个基本的误解。


给定定义的路线:

<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 }

浏览器请求返回我的响应,Content-Type: application/json但实际内容是text/html内容而不是序列化的 JSON。Accept如果我在请求中明确指定标头,因为Accept: text/html我收到的响应的内容类型标头为Content-Type: text/html.

任何帮助将不胜感激!

4

1 回答 1

1

如果要基于 Content-type 标头进行内容协商,则需要 BodyListener 而不是 FormatListener。阅读文档

于 2014-07-14T06:45:50.267 回答