jQuery POST 通过 CORS 到 web 服务

Posted

技术标签:

【中文标题】jQuery POST 通过 CORS 到 web 服务【英文标题】:jQuery POST to webservice via CORS 【发布时间】:2012-11-22 02:26:12 【问题描述】:

我已经阅读了很多关于 CORS 和 javascript 以及更改帖子中标题的主题,但我找不到我正在寻找的正确示例。

所以我要先解释一下情况:

我无法对网络服务器进行任何更改,因为这超出了我的能力范围(这是一个 SAP Cloud Portal) 我只能更改 POST 代码,所以我只能控制我发送的内容。

以下帖子中描述了我遇到的问题: jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox

--> 我的 FF 和 Chrome 标头发送一个 METHOD OPTIONS 而不是 METHOD POST。

我编写的示例代码可以在 IE 中运行,但不能在 FF 和 Chrome 中运行:

var dataString = "<result><firstname>example</firstname><lastname>ThisIsSparta</lastname></result>";
    var urlString = "http://delyo001.you.local:8000/sap/bc/youconsulting/ws/rest/anonymous/z_names_post";

    //Add TO SAP.
    var aData =  
            jQuery.ajax(
                type: "POST",
                contentType: "application/xml",
                url: urlString,  // for different servers cross-domain restrictions need to be handled
                data: dataString,
                dataType: "text",
                success: function(xml)  // callback called when data is received
                    //oModel.setData(data);             // fill the received data into the JSONModel
                    alert("success to post");
                ,

                error: function(xml)  // callback called when data is received
                    //oModel.setData(data);             // fill the received data into the JSONModel
                    alert("fail to  post");
                
            );
        );

或者

var invocation = new XMLHttpRequest();
var url = 'http://delyo001.you.local:8000/sap/bc/youconsulting/ws/rest/anonymous/z_names_post';
var body = '<result><firstname>perthyrtyrtygop</firstname><lastname>sparta</lastname></result>';


   invocation.open('POST', url, true);
   invocation.setRequestHeader('X-PINGOTHER', 'pingpong');
   invocation.setRequestHeader('Content-Type', 'application/xml');
   invocation.send(body);

我找到了 2 种方法来解决此问题,但没有任何示例: - 用代理做点什么? - 发送特定的标题

有关我的问题的更多信息,请访问: - http://scn.sap.com/message/13697625#13697625

【问题讨论】:

我需要通过代理找到一种方法 :) OPTIONS 请求是 CORS 的“预检请求”,发送是因为您使用了不常见的 Content-Type 标头,这使其成为“非简单”的 CORS 请求。非简单请求需要浏览器向服务器发送一个 OPTIONS 请求,以验证动词和标头是否是预期的。我在this answer 中讨论非简单请求,它也链接到CORS page of html5 Rocks。 【参考方案1】:

如果您无法在服务器端设置正确的标头并且您无法修改 jsonP 的响应,您确实应该使用代理。

代理脚本是一种中间件。您向脚本发出请求,脚本获取数据并将其返回给您。例如php proxy。你可以在 asp、jsp、flash 甚至 java applet 中做同样的事情。

现在您拥有 SAP 服务、位于您首选位置的代理 (php) 文件,以及与代理位于同一域中的本地 javascript。你甚至不需要 CORS。

如果您想将代理放在另一个域中,您必须确保 php 文件发送正确的标头。 (Access-Control-Allow-Origin yourdomainAccess-Control-Allow-Origin * for allow all

【讨论】:

您好VDP,感谢您的回复!这确实是正确的方法,我将尝试找到一些我可以编辑的 Javascript 代码。再次感谢!

以上是关于jQuery POST 通过 CORS 到 web 服务的主要内容,如果未能解决你的问题,请参考以下文章

启用从 jQuery ajax 到不在 IIS 中托管的 WCF 服务的 CORS POST

asmx web 服务 - jQuery ajax post json (500 错误) - CORS (Access-Control-Allow-Origin 设置为 *)

Amazon S3 CORS POST 因 JQuery-file-upload 失败

如何使用 Web 服务和 jQuery Ajax 启用 CORS

Bottle Py:为 jQuery AJAX 请求启用 CORS

带有 CORS 和 IE9 的 ASP Web API POST 请求(XDomainRequest 对象)