如何调试需要接受标头的路由?

时间:2016-11-18 19:06:07

标签: api symfony versioning fosrestbundle

我正在关注API版本的FOSRest documentation

但是我不清楚标题如何使用media_type将其连接到特定控制器。

现在我发送标题:Accept: application/json;version=1.0,Chrome扩展程序 Postman /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.yml condition: "request.attributes.get('version') == '1.0'"

中无济于事

我错过了什么?

1 个答案:

答案 0 :(得分:1)

部分感谢@Mohammad在评论中指出我正确的方向,我最终找到了答案。

在再次查看FOSRest versioning documentation的同时,我们将完全按照字面意思进行操作。

要求之一

  

您必须为所有支持的版本配置可能的mime类型:

这意味着因为我只有:

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版本号。

如果版本号不正确或者没有API版本标题,它最终也会路由到404响应。