我正在使用FOSRestBundle来管理我的api。我已经有一个正在运行的sf2应用程序,我想允许第三方访问我的一些应用程序功能。我配置了我的api,它按预期工作,我可以成功消耗我的api路由 例如:
GET http://my.domain.ldt/api/v1/users
我的Api只处理json格式,这是我的fos_rest配置:
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener: true
view:
view_response_listener: 'force'
exception_wrapper_handler: My\ApiBundle\Handlers\ApiExceptionWrapperHandler
formats:
json : true
failed_validation: HTTP_BAD_REQUEST
templating_formats:
html: false
xml: false
routing_loader:
default_format: json
include_format: false
exception:
enabled: true
service:
view_handler: my.view_handler
services:
my.json_handler:
class: My\ApiBundle\Handlers\JsonHandler
my.view_handler:
parent: fos_rest.view_handler.default
calls:
- ['registerHandler', [ 'json', ["@my.json_handler", 'createResponse'] ] ]
正如我所说,我的Api效果很好,但我遇到了一个主要问题:当我尝试从我的网络浏览器(http://my.domain.ldt/或http://my.domain.ldt/login)访问主应用程序时,我得到了以下回复而不是我的经典网页:
An Exception was thrown while handling: No matching accepted Response format could be determined
为什么我的fos_rest conf适用于我的主网站?是否可以只为api路由设置api conf?我错过了什么吗?
答案 0 :(得分:1)
问题是你忘了为FOSRestBundle的格式监听器定义规则。
实际上我不确定你是否需要这个监听器,因为你似乎使用json作为默认格式。格式侦听器将尝试匹配Accept
标头,并根据它提取当前请求格式。所以除非你想为你的api支持除json之外的其他格式,否则你就不能使用它。
如果您想修复它而不是删除它,您必须使用以下内容更新配置:
fos_rest:
format_listener:
enabled: true
rules:
- { path: '^/', priorities: ['json', 'xml', 'html], fallback_format: 'json' }
当然,您可以更改此规则,以便为您的api制定不同的规则:
fos_rest:
format_listener:
enabled: true
rules:
- { path: '^/api', fallback_format: 'json' }
- { path: '^/', fallback_format: 'html' }