Angular CORS 适用于 GET 但不适用于 DELETE

Posted

技术标签:

【中文标题】Angular CORS 适用于 GET 但不适用于 DELETE【英文标题】:Angular CORS works for GET but not for DELETE 【发布时间】:2015-01-04 20:31:42 【问题描述】:

我有一个 Angular 应用程序进行跨源调用。所有的 GET 调用都很好用。但 DELETE 调用会引发错误:

XMLHttpRequest cannot load http://my.url.com:8080/api/invoices/12768. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. 

在后端,我将 JAX-RS 与 Glassfish 4.1 和 Java 8 一起使用。我正在创建 ResponseBuilder,如下所示:

ResponseBuilder responseBuilder = Response
                    .status(status)
                    .type(MediaType.APPLICATION_JSON)
                    .header("Access-Control-Allow-Origin", "*")
                    .header("Access-Control-Allow-Credentials", "true")
                    .header("Access-Control-Allow-Methods", "POST, GET, DELETE")
                    .header("Access-Control-Max-Age", "1209600")
                    .allow("OPTIONS");

在 Angular 中,我正在像这样进行服务调用:

$http.delete(requestUrl)
                     .success(function (data, status, headers, config) 
                    deferred.resolve(data);
                ).error(function (data, status, headers, config) 
                    deferred.reject(status);
                );

问题是,这很好用:

$http.get(requestUrl)
                     .success(function (data, status, headers, config) 
                    deferred.resolve(data);
                ).error(function (data, status, headers, config) 
                    deferred.reject(status);
                );

知道为什么 GET 可以工作,但不能 DELETE 吗?

编辑:

另外,我知道这不是服务器端,因为如果我在本地计算机上通过Advanced Rest Client 运行删除调用,DELETE 就可以完美运行。

编辑 2:

请求标头

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) 
Chrome/ipaddress Safari/537.36
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,es;q=0.6
Cookie: treeForm_tree-hi=treeForm:tree:applications

响应标头

Server: GlassFish Server Open Source Edition 4.1 
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1 Java/Oracle Corporation/1.8)
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, DELETE
Access-Control-Max-Age: 1209600
Allow: OPTIONS 
Content-Type: application/json 
Date: Fri, 07 Nov 2014 23:39:10 GMT 

内容长度:0

这些是来自正在工作的 Advanced Rest Client 的标头

【问题讨论】:

你在什么浏览器上运行这个? 请求和响应中的HTTP详细信息。 铬。 “请从请求和响应中获取 HTTP 详细信息”是什么意思? 在 chrome 中从网络或您发送它的任何地方请求/响应。 【参考方案1】:

好的,显然 Angular 从标题中剥离了内容类型。使用这个作品:

$http.delete(url:request,headers:'Content-Type':'application/json')

【讨论】:

以上是关于Angular CORS 适用于 GET 但不适用于 DELETE的主要内容,如果未能解决你的问题,请参考以下文章

Go Restful API:CORS 配置适用于 React 但不适用于 Angular

net.core 和 angular4 应用程序的 Cors 问题 - 适用于 azurewebsites.net 域而不是自定义

CORS 中间件适用于 app.get 但不适用于 app.post

我在 Angular 中使用动态编译器,但它只适用于视图引擎,但不推荐使用视图引擎

多个 CORS 适用于 GET 但不适用于 PUT/POST 与飞行前请求 Web api 2

Nest JS CORS 错误 0 未知,适用于 Android 浏览器,但适用于 PC 浏览器