Symfony 2 - 允许OPTIONS请求

时间:2017-08-29 08:50:03

标签: php api symfony request options

我有一个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"被允许。那么解决所有路线的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您只有POST方法的行动路线:

@Rest\Post("/login", name="api_security_login", options={"method_prefix" = false})

如果您想回答OPTIONS个请求,则必须使用@Rest\Options注释定义选项路由。

您可以在同一操作上有多个注释,并在操作中测试方法(通常是GETPOST用于表单操作的情况),或者使用相同的操作定义两个不同的操作路径但方法不同。

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