在 Symfony2 和 FOSRestBundle 制作的 REST api 中使用 Accept header 的正确方法

Proper way to use Accept header in a REST api made with Symfony2 and FOSRestBundle

我正在尝试使我的 Web 服务 return 在使用接受 header 发送时采用正确的格式。例如,如果我发送 'Accept: application/xml',它应该 return 格式为 xml,如果我发送 'Accept: application/json',它应该 return 格式为 json .

如果我放置扩展名,这会很好用。 http://example.com/api/users.json returns json, and http://example.com/api/users.xml returns XML。但如果我不放扩展名,它 return 总是 json,完全忽略接受 header。

我如何设置它,使其在没有扩展名的情况下,return接受 header 上的任何要求?

我的配置文件:

fos_rest:
    format_listener: true
    routing_loader:
        default_format: json
    view:
        view_response_listener: 'force'
        formats:
            json: true
            xml: true
        templating_formats:
            html: true
    serializer:
        serialize_null: true

sensio_framework_extra:
    view:       { annotations: false }
    router:     { annotations: true }

也试过这个:

format_listener:
    rules:
        - prefer_extension: false

结果出错:

找不到模板"WhateverBundle:Users:getUsers.html.twig"

我能够用这个做我想做的事:

fos_rest:
    format_listener:
        rules:
            - priorities: [ json, xml, html ]
            - prefer_extension: false
    routing_loader:
        default_format: json
    view:
        view_response_listener: 'force'
        formats:
            json: true
            xml: true
        templating_formats:
            html: true
    serializer:
        serialize_null: true

出于某种原因,仅在 format_listener 中配置 prefer_extension 是不够的。