基于 jQuery AJAX SOAP 的 Web 服务和 CORS(跨源资源共享)[关闭]
Posted
技术标签:
【中文标题】基于 jQuery AJAX SOAP 的 Web 服务和 CORS(跨源资源共享)[关闭]【英文标题】:jQuery AJAX SOAP based web services and CORS (cross origin resource sharing) [closed] 【发布时间】:2013-03-23 22:31:28 【问题描述】:几周以来,我一直在尝试让我的一个基于 jQuery AJAX SOAP 的跨域 Web 服务通过我为我的一位客户编写的 jQuery 插件工作。 我所做的大部分研究似乎表明这是不可能的,因为 CORS 或跨域资源共享只允许 jasonP (GET) 类型的调用。
我终于想出了如何让它发挥作用,并认为我会分享我必须做的事情。
首先要了解的是,在支持 CORS 的浏览器中,服务器位于另一个域中,除 GET 之外的任何其他参数(以及其他参数)都将导致所谓的预检检查。这意味着浏览器将向服务器询问允许执行的选项列表。 除非服务器返回确切的选项列表以允许基于 SOAP 的 Web 服务,否则即使在发出实际请求之前,调用也会失败。
您需要做的是让 Web 服务器(在我的示例中为 IIS7.5)返回正确的选项列表。 为此,您可以在 inetpub\wwwroot 文件夹中配置 web.config 文件(如果您没有,只需创建它并将以下内容复制到其中)。
我的 web.config 文件如下所示。
重要的是,一切都区分大小写,一旦我意识到一切都按预期工作。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, PUT, DELETE" />
<add name="Access-Control-Allow-Headers" value="content-type,soapaction,x-requested-with" />
</customHeaders>
</httpProtocol>
<handlers accessPolicy="Read, Execute, Script" />
</system.webServer>
</configuration>
我的 jQuery AJAX 代码如下所示。
var getNextJobId = function()
var se = '';
se = se + '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
se = se + '<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">';
se = se + '<soap-env:Body>';
se = se + '<ebas:getNextJobIdRequest xmlns:ebas="http://www.ebasetech.com">';
se = se + '<ebas:ORGCODE>' + plugin.settings.orgcode + '</ebas:ORGCODE>';
se = se + '</ebas:getNextJobIdRequest>';
se = se + '</soap-env:Body>';
se = se + '</soap-env:Envelope>';
$.ajax(
url: params.webserviceTargetUrl,
beforeSend: function(xhr)
xhr.setRequestHeader("SOAPAction", "getNextJobId");
,
type: "POST",
dataType: "xml",
data: se,
crossDomain: true,
headers: "X-Requested-With": "XMLHttpRequest",
async: false,
success: function(xml)
params.jobId = $(xml).find("ebas\:JOBID").text();
,
failure: function(xml)
params.webserviceFailure = $(xml).text();
,
contentType: "charset=UTF-8"
);
【问题讨论】:
将failure
更改为error
。
+1 用于 jQuery 中的 SOAP
这个问题似乎离题了,因为它不符合我们的Q&A format for this self-answered questions。考虑将答案与问题分开。
【参考方案1】:
“这是不可能的,因为 CORS 或跨域资源共享只允许 jasonP (GET) 类型的调用。”
CORS 不限于 GET 方法,也不限于 JSONP 样式的调用。
JSONP 是一种在 CORS 标准化之前 Web 开发人员使用的技术,用于向服务于页面的主机以外的主机执行 AJAX 请求。 JSONP 通过在页面中插入<script>
标签来工作。它需要服务器参与,通常通过将 JSON 结果包装在对函数的调用中,该函数在 AJAX 调用中通过 callback
参数命名。看到这个答案:what-is-jsonp-all-about。
正如您所指出的,JSONP 仅限于执行 GET 方法,因为<script>
仅执行 GET。它也有其他问题,例如无法处理错误。例如,如果返回 400 响应,则脚本根本不会被浏览器执行,而不是执行 AJAX 调用的 JS 错误处理程序。
CORS 是一个较新的标准。它还需要服务器参与,因为它必须处理预检检查,并使用额外的 HTTP 标头,例如:Access-Control-Allow-Origin
、Access-Control-Allow-Methods
和 Access-Control-Allow-Headers
,您在问题的编辑中对此进行了很好的描述。它不限于 GET 方法。相反,它仅限于由Access-Control-Allow-Methods
标头中的预检检查结果指定的那些方法。 CORS 不需要在回调函数中包装结果或对结果进行任何其他调整,它可以处理错误和其他状态代码。请参阅此出色的overview of CORS 了解更多信息。
【讨论】:
这里和您包含的链接中的一些很好的附加信息。谢谢你们。以上是关于基于 jQuery AJAX SOAP 的 Web 服务和 CORS(跨源资源共享)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Python入门自学进阶-Web框架——8认识Ajax,与Django交互,基于jQuery
通过 Ajax Javascript 调用 SAP SOAP Web 服务——绕过跨域策略
windows phone 7 - phonegap 停止 jquery.ajax