2016-11-18 1 views
0

Я следую FOSRest documentation по версии API.Как отлаживать маршруты, требующие принимать заголовки?

Однако мне непонятно, как заголовки соединяют его с конкретным контроллером, используя media_type.

Сейчас я посылаю заголовки: Accept: application/json;version=1.0 с расширением Chrome Почтальон к /api/user/status

Однако я получаю ошибку No route found for "POST /api/user/status"

Вот моя конфигурация:

routing.yml :

type: rest 
prefix: /api 
resource: Acme\Bundle\SomeBundle\Controller\DefaultController 

DefaultController.php:

use FOS\RestBundle\Controller\Annotations\Version; 

/** 
* @Version("1.0") 
* @RouteResource("User", pluralize=false) 
*/ 
class User 

... 

public function postStatusAction() 

config.yml

fos_rest: 
    versioning: 
     enabled: true 
     resolvers: 
      query: false 
      custom_header: false 
      media_type: 
       enabled: true 
       regex: '/(v|version)=(?P<version>[0-9\.]+)/' 
    routing_loader: 
     default_format: json 
    view: 
     mime_types: 
      json: ['application/json;version=1.0'] 
    format_listener: 
     enabled: true 

консоль отладки: маршрутизатор post_user_status

| Route Name | post_user_status          | 
| Path   | /api/user/status.{_format}        | 
| Path Regex | #^/api/user/status(?:\.(?P<_format>json|xml|html))?$#s | 
| Host   | ANY              | 
| Host Regex |               | 
| Scheme  | ANY              | 
| Method  | POST             | 
| Requirements | _format: json|xml|html         | 
| Class  | Symfony\Component\Routing\Route       | 
| Defaults  | _controller: AcmeSomeBundle:Default:postStatus   | 
|    | _format: json           | 
| Options  | compiler_class: Symfony\Component\Routing\RouteCompiler | 
+--------------+---------------------------------------------------------+ 

Я также попытался без толку в routing.ymlcondition: "request.attributes.get('version') == '1.0'"

Что мне не хватает?

+0

Ваша ошибка в маршрутизации вы должны изменить 'префикс: api' на' префикс:/api' –

+0

@MohammadZareMoghadam Спасибо, но даже с этим изменением я все еще получаю ту же ошибку – Tek

+0

добавьте в 'format_listener' раздел: '- {path: '^/api', приоритеты: ['json'], fallback_format: json, prefer_extension: false}' –

ответ

1

Отчасти благодаря @Mohammad в комментариях для указания меня в правильном направлении, в конце концов я нашел ответ.

При просмотре FOSRest versioning documentation инструкции должны быть выполнены буквально.

Одно из требований гласит

Вы должны настроить возможные типы пантомимы для всех поддерживаемых версий:

Это означает, что, так как у меня было только:

view: 
    mime_types: 
     json: ['application/json;version=1.0'] 

Даже если в отправленном заголовке запрошена версия API, которой не было, она все равно не выполняла никаких обязательств.

Правильная конфигурация является

view: 
    mime_types: 
     json: ['application/json','application/json;version=1.0'] 

наряду с упоминанием о том, что Mohhamad media_type заголовков требуют format_listener

format_listener: 
    enabled: true 
    rules: 
     - { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: false } 

С этими маршрутами правильно правильного номер версии API.

Он также, наконец, отправляется на ответ 404, если номер версии неверен или нет заголовка версии API.

Смежные вопросы