我正在关注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'"
我错过了什么?
答案 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响应。