我有一个symfony 2后端,我已将其安装在服务器上。我的前端是一个离子PWA,所以它在浏览器中运行,它也安装在该服务器上,但与其他子域。当我从网络应用程序向后端发送请求时,我收到此错误:
选项https://api.example.com/api/login.json
XMLHttpRequest无法加载https://api.example.com/api/login.json。响应 for preflight具有无效的HTTP状态代码405
这是我的登录操作代码:
/**
* Login via username and password or via API key
*
* @Doc\ApiDoc(
* section="Security",
* description="Login",
* views={"default", "security"}
* )
*
* @param ParamFetcher $params
*
* @Rest\RequestParam(name="username", nullable=true, description="Username")
* @Rest\RequestParam(name="password", nullable=true, description="Password")
* @Rest\RequestParam(name="apikey", nullable=true, description="API key (alternative to username + password)")
*
* @Rest\Post("/login", name="api_security_login", options={"method_prefix" = false})
*
* @return Response
*/
public function loginAction(ParamFetcher $params)
{
//...do some stuff here...//
$data = array(
'user' => $userValue,
'apikey' => $user->getApiKey(),
);
$groups = array('default', 'private');
return $this->createAPIResponse(self::STATUS_OK, $data, $groups);
}
这是来自回复的标题:
Access-Control-Allow-Methods:GET,POST,OPTIONS,DELETE,PUT
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:no-cache
Connection:Keep-Alive
Content-Length:54
Content-Type:application/json
Date:Tue, 29 Aug 2017 08:33:26 GMT
Keep-Alive:timeout=5, max=100
Server:Apache
这是prod.log文件中的错误消息:
request.ERROR:未捕获的PHP异常 Symfony的\分量\ HttpKernel \异常\ MethodNotAllowedHttpException: "找不到"选项的路径/api/login.json":方法不允许 (允许:POST)"在 /var/www/example.com/api/htdocs/symfony/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/RouterListener.php 第163行{"例外":" [对象] (Symfony的\元器件\ HttpKernel \异常\ MethodNotAllowedHttpException(代码: 0):找不到\" OPTIONS /api/login.json\"的路线:不允许的方法 (允许:POST)at /var/www/example.com/api/htdocs/symfony/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/RouterListener.php:163, Symfony的\分量\路由\异常\ MethodNotAllowedException(代码: 0):at /var/www/example.com/api/htdocs/symfony/app/cache/prod/appProdUrlMatcher.php:855)"} []
因为"允许&#34>因此似乎不允许因为CORS而发送的OPTIONS请求。标题,只有" POST"被允许。那么解决所有路线的最佳方法是什么?
答案 0 :(得分:2)
您只有POST
方法的行动路线:
@Rest\Post("/login", name="api_security_login", options={"method_prefix" = false})
如果您想回答OPTIONS
个请求,则必须使用@Rest\Options
注释定义选项路由。
您可以在同一操作上有多个注释,并在操作中测试方法(通常是GET
和POST
用于表单操作的情况),或者使用相同的操作定义两个不同的操作路径但方法不同。
http://symfony.com/doc/master/bundles/FOSRestBundle/7-manual-route-definition.html
答案 1 :(得分:0)
没有接受选项http方法的路由。
No route found for "OPTIONS /api/login.json"
您需要先定义它:
/**
* @Rest\Route(
* "/login",
* name="api_security_login",
* methods = {
* Request::METHOD_POST,
* Request::METHOD_OPTIONS,
* }
* )
*/
之后清除缓存并验证路由是否有效,即使用:
bin/console debug:router | grep -i api_security_login