加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何使用Symfony 2和FOSRestBundle从同一路径提供HTML和J

发布时间:2020-12-13 22:53:06 所属栏目:PHP教程 来源:网络整理
导读:我试图使用 Symfony和 FOSRestBundle(版本1.3)以html和json格式提供内容(我也想最终允许xml).我已成功使用_format参数为路由提供不同的内容,例如: /foo.json将导致JSON响应, 和/ foo将导致HTML响应. 是否有任何方法可以使用_format以外的其他内容协调(在同
我试图使用 Symfony和 FOSRestBundle(版本1.3)以html和json格式提供内容(我也想最终允许xml).我已成功使用_format参数为路由提供不同的内容,例如:

> /foo.json将导致JSON响应,
>和/ foo将导致HTML响应.

是否有任何方法可以使用_format以外的其他内容协调(在同一主机上!)相同的内容协商,例如Content-Type或Accept标头?

我看过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

如果我想要以默认(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.

任何帮助将不胜感激!

解决方法

如果您希望基于Content-type标头进行内容协商,则需要使用BodyListener而不是FormatListener.
阅读 documentation.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读