不允许使用 Symfony3 fosrest api 方法选项
Symfony3 fosrest api method options not allowed
我用 FOSrestBundle 和 NelmioCORSBundle 在 Symfony 3 中构建了 api。
在我的控制器中,我有一个方法 postSaveLotteryAction(),fosrest 将其转换为路由 /lotteries/saves/lotteries
现在我的 ReactJS 应用程序使用 Axios 向 api(托管在不同域上)发出 xhr (ajax) 请求,并且由于 CORS,它首先发送一个 OPTIONS 请求.
我的 Apache 服务器配置正确 headers 如下所示。
Symfony 显示的消息是 405 方法不允许。但是所有指向OPTIONS方法的都是允许的。
Access-Control-Allow-Headers: x-requested-with, Content-Type, origin, authorization, accept, client-security-token
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 1000
Allow:
Connection: Keep-Alive
Content-Length: 250
Content-Type: text/html; charset=iso-8859-1
Date: Wed, 11 Apr 2018 07:03:30 GMT
Keep-Alive: timeout=2, max=100
Server: Apache/2
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: api.naamloting.nl
Origin: http://beta.naamloting.nl
这是我的 bin/console d:r 输出,我在其中添加了 route.yml GET、OPTIONS、POST 方法。
get_lottery GET|POST|OPTIONS ANY ANY /lotteries/{uuid}
get_lottery_stats GET|POST|OPTIONS ANY ANY /lottery/stats
post_lottery_save_lottery GET|POST|OPTIONS ANY ANY /lotteries/saves/lotteries
get_lottery_image GET|POST|OPTIONS ANY ANY /lotteries/{nameOfWinner}/image
get_lottery_ticket GET|POST|OPTIONS ANY ANY /lotteries/{nameOfWinner}/ticket
这也是我的 config.yml(部分),因此可以更清楚地了解可能导致它的原因。
# Nelmio CORS
nelmio_cors:
defaults:
allow_origin: ['*']
allow_methods: ["POST", "PUT", "GET", "DELETE", "OPTIONS"]
allow_headers: ["content-type"]
max_age: 3600
paths:
'^/lottery': ~
'^/lotteries': ~
# FOS REST Bundle
fos_rest:
body_listener: true
param_fetcher_listener: true
view:
view_response_listener: 'force'
formats:
jsonp: true
json: true
xml: false
rss: false
mime_types:
json: ['application/json', 'application/x-json']
jpg: 'image/jpeg'
png: 'image/png'
jsonp_handler: ~
routing_loader:
default_format: json
include_format: false
format_listener:
rules:
- { path: ^/, priorities: [ json, jsonp ], fallback_format: ~, prefer_extension: true }
exception:
enabled: true
exception_controller: 'fos_rest.exception.controller:showAction'
似乎有时会在 HEADER 中使用真正需要的方法进行 "preflight" OPTIONS 请求。
我看到您允许在 nelmio 中使用 "PUT" 方法,但在路由中不允许。尝试在路由中允许 PUT,看看是否能解决问题。
更多信息:
已解决
查看错误页面,在我看来,Symfony 不是问题所在,我是对的。
Apache 是不允许 OPTIONS 方法的麻烦制造者,所以它总是返回 405 不允许。
我添加了方法类型并且正确处理了请求。
我用 FOSrestBundle 和 NelmioCORSBundle 在 Symfony 3 中构建了 api。
在我的控制器中,我有一个方法 postSaveLotteryAction(),fosrest 将其转换为路由 /lotteries/saves/lotteries
现在我的 ReactJS 应用程序使用 Axios 向 api(托管在不同域上)发出 xhr (ajax) 请求,并且由于 CORS,它首先发送一个 OPTIONS 请求. 我的 Apache 服务器配置正确 headers 如下所示。
Symfony 显示的消息是 405 方法不允许。但是所有指向OPTIONS方法的都是允许的。
Access-Control-Allow-Headers: x-requested-with, Content-Type, origin, authorization, accept, client-security-token
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 1000
Allow:
Connection: Keep-Alive
Content-Length: 250
Content-Type: text/html; charset=iso-8859-1
Date: Wed, 11 Apr 2018 07:03:30 GMT
Keep-Alive: timeout=2, max=100
Server: Apache/2
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: api.naamloting.nl
Origin: http://beta.naamloting.nl
这是我的 bin/console d:r 输出,我在其中添加了 route.yml GET、OPTIONS、POST 方法。
get_lottery GET|POST|OPTIONS ANY ANY /lotteries/{uuid}
get_lottery_stats GET|POST|OPTIONS ANY ANY /lottery/stats
post_lottery_save_lottery GET|POST|OPTIONS ANY ANY /lotteries/saves/lotteries
get_lottery_image GET|POST|OPTIONS ANY ANY /lotteries/{nameOfWinner}/image
get_lottery_ticket GET|POST|OPTIONS ANY ANY /lotteries/{nameOfWinner}/ticket
这也是我的 config.yml(部分),因此可以更清楚地了解可能导致它的原因。
# Nelmio CORS
nelmio_cors:
defaults:
allow_origin: ['*']
allow_methods: ["POST", "PUT", "GET", "DELETE", "OPTIONS"]
allow_headers: ["content-type"]
max_age: 3600
paths:
'^/lottery': ~
'^/lotteries': ~
# FOS REST Bundle
fos_rest:
body_listener: true
param_fetcher_listener: true
view:
view_response_listener: 'force'
formats:
jsonp: true
json: true
xml: false
rss: false
mime_types:
json: ['application/json', 'application/x-json']
jpg: 'image/jpeg'
png: 'image/png'
jsonp_handler: ~
routing_loader:
default_format: json
include_format: false
format_listener:
rules:
- { path: ^/, priorities: [ json, jsonp ], fallback_format: ~, prefer_extension: true }
exception:
enabled: true
exception_controller: 'fos_rest.exception.controller:showAction'
似乎有时会在 HEADER 中使用真正需要的方法进行 "preflight" OPTIONS 请求。
我看到您允许在 nelmio 中使用 "PUT" 方法,但在路由中不允许。尝试在路由中允许 PUT,看看是否能解决问题。
更多信息:
已解决
查看错误页面,在我看来,Symfony 不是问题所在,我是对的。
Apache 是不允许 OPTIONS 方法的麻烦制造者,所以它总是返回 405 不允许。
我添加了方法类型并且正确处理了请求。