【问题标题】:ajax request to symfony api returns No 'Access-Control-Allow-Origin' header is present对 symfony api 的 ajax 请求返回不存在“Access-Control-Allow-Origin”标头
【发布时间】:2017-07-27 16:41:37
【问题描述】:

我正在使用 React 制作简单的应用程序,将 ajax 请求发送到使用 Symfony 制作的 API。我正在开发 react 应用程序和 symfony api。我正在从 localhost:3000 向 localhost:8000 发送请求。这是我发送的 ajax 请求

addUser (data) {
    console.log('made it')
    let request = {
      method: 'post',
      url: 'http://127.0.0.1:8000/user/post',
      data: JSON.stringify({'username': data}),
      contentType: 'application/json'
    }
    $.ajax(request)
      .done(data => this.addUserSuccess(data))
      .fail(err => this.addUserFail(err))
  }

这里是处理请求的 Symmfony 应用程序

/**
     * Creates a new user entity.
     *
     * @Route("/post", name="user_new")
     * @Method({"GET", "POST"})
     */
    function newAction(Request $request ) {
        echo $request;
        $body = $request->getContent();
        $body = json_decode($body,true);
        $username = $body['username'];
        $user = new User($username);
        $em = $this->getDoctrine()->getManager();
        $em->persist($user);
        $em->flush();

        return new JsonResponse($user,200,array('Access-Control-Allow-Origin'=> '*'));
    } 

到目前为止,我还处于起步阶段,如您所见,我正在创建没有密码、安全性或任何其他内容的新用户。我只是想让它工作并能够将请求从应用程序发送到 api。这是结果

XMLHttpRequest 无法加载 http://127.0.0.1:8000/user/post。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:3000' 不允许访问。响应的 HTTP 状态代码为 405。

我以前见过很多类似这样的问题,其中一个答案是返回带有标题的 JsonResponse,你可以看到它不起作用。

这是我遵循的答案之一 - Origin is not allowed by Access-Control-Allow-Origin 但不幸的是没有成功。

你能告诉我如何解决它吗?提前谢谢!

【问题讨论】:

标签: javascript php ajax symfony


【解决方案1】:

这是我针对相同情况所做的。在app/config/config_dev.yml 中,添加新服务。把它放在config_dev.yml 意味着这只会影响通过app_dev.php 的请求。

services:
    app.cors_listener:
        class: AppBundle\Security\CorsListener
        tags:
            - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

还有AppBundle/Security/CorsListener.php的内容:

<?php
namespace AppBundle\Security;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

// Based on http://stackoverflow.com/a/21720357
class CorsListener
{
    public function onKernelResponse(FilterResponseEvent $event)
    {   
        $responseHeaders = $event->getResponse()->headers;

        $responseHeaders->set('Access-Control-Allow-Headers', 'origin, content-type, accept, credentials');
        $responseHeaders->set('Access-Control-Allow-Origin', 'http://localhost:8080');
        $responseHeaders->set('Access-Control-Allow-Credentials', 'true');
        $responseHeaders->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS');
    }
}

【讨论】:

  • 谢谢,这成功了!我必须在我的函数中添加,我必须添加 OPTIONS 作为允许的方法。出于某种原因,Symfony api 接受了请求,但出现了内部服务器错误。你能告诉我如何调试 api 吗?意思是如何将信息放在控制台上并查看实际发生的情况?类似 dump() 的东西可以在控制台上运行
  • 我自己只是在学习 symfony,而且我已经有一段时间没有使用它了,所以也许其他人可以在这方面提供更多帮助。但首先,请检查 this answer 和您服务器的错误日志以帮助解决该内部服务器错误。
【解决方案2】:

您需要在 PHP 文件中设置正确的标题。

 header('Access-Control-Allow-Origin: *');

【讨论】:

  • 只是为了提供更多上下文stackoverflow.com/questions/10143093/…
  • 在哪个php文件中?我在函数的开头添加了代码,它仍然不起作用。我正在使用 Symfony,它有很多文件,我不知道应该把它放在哪里。在 AppKernel 中?应用程序.php?我认为它必须在响应中,这就是为什么在 JsonResponse 作为最后一个参数中我发送带有标头的数组,在这种情况下标头是 Access-Control-Allow-Origin,其值为 *。还是什么都没有
猜你喜欢
  • 2015-11-18
  • 1970-01-01
  • 2019-03-08
  • 2019-07-04
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
相关资源
最近更新 更多