Правильный способ использования заголовка Accept в API REST, созданном с помощью Symfony2 и FOSRestBundle.

Я пытаюсь заставить свои веб-сервисы возвращать правильный формат при отправке с заголовком Accept. Например, если я отправлю «Принять: приложение/xml», он должен вернуться в формате xml, а если я отправлю «Принять: приложение/json», должен вернуться в формате json.

Это отлично работает, если я поставлю расширение. http://example.com/api/users.json возвращает json, а http://example.com/api/users.xml возвращает XML. Но если я не ставлю расширения, он всегда возвращает json, полностью игнорируя заголовок Accept.

Как я могу настроить его таким образом, чтобы при отсутствии расширения он возвращал все, что запрашивается в заголовке Accept?

Мой файл конфигурации:

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"


person Nuno Barreto    schedule 22.04.2015    source источник


Ответы (1)


Я смог сделать то, что хотел, с этим:

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

По какой-то причине просто иметь конфигурацию Prefer_extension в format_listener недостаточно.

person Nuno Barreto    schedule 22.04.2015