Javascript AngularJS和Symfony 3 CORS的镀铬版

Javascript AngularJS和Symfony 3 CORS的镀铬版,javascript,php,angularjs,symfony,google-chrome,Javascript,Php,Angularjs,Symfony,Google Chrome,上周我一直在努力解决后端和前端的一个bug 我制作了一个restapi(php/symfony)来管理书籍和作者。我在删除时遇到了一个跨来源请求的问题,自那以后就得到了修复。现在我有一个关于PUT(POST)的问题,这个问题只出现在Chrome(v62.0.3202.94)上。在postman上试用了我的API,它运行良好,在Edge和Firefox上也进行了测试。 我尝试过使用Allow控件Allow Origin:*插件,但也没有成功。 每次我都会犯同样的错误: Request URL:ht

上周我一直在努力解决后端和前端的一个bug

我制作了一个restapi(php/symfony)来管理书籍和作者。我在删除时遇到了一个跨来源请求的问题,自那以后就得到了修复。现在我有一个关于PUT(POST)的问题,这个问题只出现在Chrome(v62.0.3202.94)上。在postman上试用了我的API,它运行良好,在Edge和Firefox上也进行了测试。 我尝试过使用Allow控件Allow Origin:*插件,但也没有成功。 每次我都会犯同样的错误:

Request URL:http://127.0.0.1/whereIsMyBook-symfony/web/app_dev.php/updateAuthor/7
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Remote Address:127.0.0.1:80
Referrer Policy:no-referrer-when-downgrade
Response Headers
view source
Access-Control-Allow-Origin:*
Allow:PUT
Cache-Control:no-cache, private
Connection:Keep-Alive
Content-Type:text/html; charset=UTF-8
Date:Tue, 05 Dec 2017 18:05:06 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.4.27 (Win64) PHP/5.6.31
Transfer-Encoding:chunked
X-Debug-Token:e8abc7
X-Debug-Token-Link:http://127.0.0.1/whereIsMyBook-symfony/web/app_dev.php/_profiler/e8abc7
X-Powered-By:PHP/5.6.31
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Access-Control-Request-Headers:access-control-allow-origin,content-type
Access-Control-Request-Method:OPTIONS
Connection:keep-alive
Host:127.0.0.1
Origin:http://localhost:8000
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
我的后端会引发一个异常:

angular.js:12265 OPTIONS http://127.0.0.1/whereIsMyBook-symfony/web/app_dev.php/updateAuthor/7 net::ERR_ABORTED
我尝试修改app.config.js并添加以下行:

['$httpProvider', function ($httpProvider) {
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
    $httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
    $httpProvider.defaults.useXDomain = true;
}]
我想我对飞行前的请求有问题,但似乎无法正确地处理它们。我浏览了很多页面,仍然找不到它为什么不起作用。正如莱娅曾经说过的:“你是我最后的希望”

以下是我的方法(在服务中):

我的API托管在本地主机上的wamp上,激活了apache headers\u模块


感谢您的善意帮助

您正在使用angular,此框架使用HTTP
选项
请求向服务器询问后端应用程序中的授权HTTP谓词

我们可以从服务器的响应中看到一些有用的信息来调试错误

  • 状态代码:405方法不允许
    ,当后端(此处为Symfony)无法处理此路由上的请求时,会返回此HTTP错误代码
  • Allow:PUT
    ,服务器返回它可以处理的动词
安装后,将此配置添加到
app/config/config.yml
文件中

nelmio_cors:
        paths:
            '^/api/':
                allow_origin: ['*']
                allow_headers: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization']
                allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
                max_age: 0
我建议您为symfony的api应用程序定义一个基本路由,比如
/api
,而不仅仅是
/update


如果有不清楚的地方,请告诉我:)

您必须在Symfony中向控制器API添加以下代码:

        $jsonContent='{"products":[{"id":1,"nom":"aza","prix":5}]}';
        $response = new Response($jsonContent);
        // $response->headers->set('Content-Type', 'application/json');
        $response->headers->set('Access-Control-Allow-Origin', '*');
        $response->headers->set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, 
        PUT, PATCH, DELETE');
        $response->headers->set('Access-Control-Allow-Headers' , 'Content-Type');

        return $response;

您需要在API上添加CORS头,因为API和前端在不同的端口上运行。此捆绑包应该允许您这样做:如果您已经在使用此捆绑包,请检查
allow_方法:['POST'、'GET'、'DELETE'、'PUT']
config settingOK It works:-)非常感谢您的宝贵时间!!!!嘿,贾斯汀,你能接受我的回答吗?这是我帮助你的报酬:)没问题,你能验证答案吗?:)@贾斯汀
        $jsonContent='{"products":[{"id":1,"nom":"aza","prix":5}]}';
        $response = new Response($jsonContent);
        // $response->headers->set('Content-Type', 'application/json');
        $response->headers->set('Access-Control-Allow-Origin', '*');
        $response->headers->set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, 
        PUT, PATCH, DELETE');
        $response->headers->set('Access-Control-Allow-Headers' , 'Content-Type');

        return $response;