FOSRestBundle: как настроить резервный формат

Моя цель - иметь вывод json по умолчанию, когда для пользовательского агента установлено что-то еще, кроме json или xml. Я настроил FOSRestBundle 1.1.0 следующим образом:

fos_rest:
format_listener: true
param_fetcher_listener: true
view:
    default_engine: php
    formats:
        json: true
        xml: true
    templating_formats:
        html: false
    view_response_listener: force
routing_loader:
    default_format: json

Это работает. Теперь я добавил следующую конфигурацию:

format_listener:
    rules:
        - { fallback_format: json, prefer_extension: false, priorities: ['xml', 'json'] }

Как только я это сделаю, я больше не могу переключаться между форматами, добавляя ?_format=json или ?_format=xml, а также заголовок Accept, похоже, игнорируется, он всегда использует все, что я указываю в заголовке accept.

Как настроить FOSRestBundle так, чтобы он принимал json или XML через заголовок запроса Parameter/HTTP и возвращался к json, если браузер принимает формат HTML?


person Drachenkatze    schedule 17.12.2013    source источник


Ответы (1)


Согласно документам FOSRestBundle:

Обратите внимание, что если _format соответствует внутри маршрута, то добавляется виртуальный параметр заголовка Accept с настройкой q, на единицу меньшей, чем самый нижний заголовок Accept, что означает, что формат проверяется на соответствие в приоритетах в последнюю очередь. Если для параметра preference_extension установлено значение true, то виртуальный заголовок Accept будет на единицу выше самого высокого значения q, что приведет к тому, что расширение будет проверено в первую очередь. Установка приоритетов для непустого массива включает согласование заголовка Accept.

Кроме того, я заметил, что в разделе rules отсутствует опция path. Таким образом, приложение не знает, к какому пути применить правила.

Взгляните на документы, на которые я ссылался выше, в них есть пример.

person Sehael    schedule 20.12.2013
comment
Хотя я несколько раз читал документацию, этот ответ привел меня к правильному решению. Правило не нужно для того, чтобы это работало; вместо этого все, что мне не хватало, это формат по умолчанию для маршрута, который я установил в JSON. - person Drachenkatze; 21.12.2013