2017-07-27 35 views
0

我正在使用React发送一个简单的应用程序,它向Symfony发出的API发送ajax请求。我正在开发反应app和symfony api。我从localhost:3000发送请求到localhost:8000。下面是我送ajax请求到symfony api返回没有'Access-Control-Allow-Origin'标头存在

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)) 
    } 

这里的AJAX请求的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。对预检请求的响应不会通过访问控制检查:请求的资源上不存在“访问控制 - 允许来源”标头。因此不允许访问原产地'http://localhost:3000'。该响应的HTTP状态代码405.

我以前看过很多像这样的问题,其中一个答案是返回JsonResponse与标题,因为你可以看到它不起作用。

下面是其中一个答案,我跟着 - - Origin is not allowed by Access-Control-Allow-Origin quenstions,但不幸的是没有成功。

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

+0

我通过大家的一些问题看,并且注意到了一些与答案,可能是适当的接受,[包括自己的答案](HTTPS:/ /stackoverflow.blog/2009/01/06/accept-your-own-answers/)。这只是一个友好的提示[接受答案](https://stackoverflow.com/help/someone-answers)如果你的问题已经解决:) – aplum

回答

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'); 
    } 
} 
+0

谢谢,这工作!我必须在我的函数中添加,我必须添加OPTIONS作为允许的方法。出于某种原因,Symfony api接受请求但有内部服务器错误。你能告诉我如何调试api吗?这意味着如何将信息放在控制台上并查看实际发生的情况?像dump()那样可以在控制台上工作 –

+0

我只是自己学习symfony,自从使用它以来已经有一段时间了,所以也许别人可以帮助更多。但要开始,请检查[此答案](https:// stackoverflow。com/a/2687747)和您的服务器的错误日志来帮助解决内部服务器错误。 – aplum

1

您需要在yout php文件上设置正确的标题。

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

只是为了给更多的上下文https://stackoverflow.com/questions/ 10143093 /原产地不允许访问控制允许来源 – Devesh

+0

在哪个PHP文件?我在函数的开头添加了代码,但它仍然无效。我正在使用Symfony,它有很多文件,我不知道应该把它放在哪里。在AppKernel中? app.php?我认为它必须在响应中,这就是为什么在作为最后一个参数的JsonResponse中,我发送带有标题的数组,并且在这种情况下,标题为值为'*'的Access-Control-Allow-Origin'。仍然没有 –