我正在尝试访问另一个域中的Web服务,但它不返回任何内容。后来我发现这是一个跨域访问的问题。
我在网上搜索了很多文章,但像我这样的新手都看不懂。:(
有人可以帮助我如何访问Web服务吗?
以下是我的代码。
//variables for Add Contacts var addAccountServiceUrl = 'http://crm.eyepax.net/organization.asmx?op=WriteOrg'; // Preferably write this out from server side var OrganizationID=123; var ParentID=123 ; var AccountManagerID="123"; var OrganizationName="Testapple"; var IncorporationNo="23"; var PostAddress="asdfklj asldfj"; var CountryID="LK"; var VisitAddress="asldkf asldkf asldfas dfasdf"; var VisitCountryID="LK"; var VisitSwithboard="242344"; var VisitFax="234234"; var Www="http://www.eyepax.com"; var Active=true; var RegBy=345345345345; var ConfigurationCode="28BC9CC3@BFEBFBFF0001067A"; var Flag=1; var LicenceOrganazationID=1; var sErr; function addContact() { //this is to be commented soon! alert("function called"); //update the webservice soapmesg var soapMessage = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> \ <soap:Body> \ <WriteOrg xmlns="http://eyepax.crm.com/Organization"> \ <OrganizationID>'+OrganizationID+'</OrganizationID> \ <ParentID>'+ParentID+'</ParentID> \ <AccountManagerID>'+AccountManagerID+'</AccountManagerID> \ <OrganizationName>'+OrganizationName+'</OrganizationName> \ <IncorporationNo>'+IncorporationNo+'</IncorporationNo> \ <PostAddress>'+PostAddress+'</PostAddress> \ <CountryID>'+CountryID+'</CountryID> \ <VisitAddress>'+VisitAddress+'</VisitAddress> \ <VisitCountryID>'+VisitCountryID+'</VisitCountryID> \ <VisitSwithboard>'+VisitSwithboard+'</VisitSwithboard> \ <VisitFax>'+VisitFax+'</VisitFax> \ <Www>'+Www+'</Www> \ <Active>'+Active+'</Active> \ <RegBy>'+RegBy+'</RegBy> \ <ConfigurationCode>'+ConfigurationCode+'</ConfigurationCode> \ <Flag>'+Flag+'</Flag> \ <LicenceOrganazationID>'+LicenceOrganazationID+'</LicenceOrganazationID> \ </WriteOrg> \ </soap:Body> \ </soap:Envelope>'; $.ajax({ url: addAccountServiceUrl, type: "POST", dataType: "xml", data: soapMessage, success: endAddContact, error: function(jqXHR, textStatus, errorThrown) {alert("failure"); console.log(textStatus);console.log(errorThrown);}, contentType: "text/xml; charset=\"utf-8\"" }); return false; } function endAddContact(xmlHttpRequest, status) { console.log(xmlHttpRequest); console.log(status); alert("webservice called!"); $(xmlHttpRequest.responseXML) .find('WriteOrgResponse') .each(function() { var orgres = $(this).find('WriteOrgResult').text(); var error = $(this).find('vstrError').text(); alert(orgres +' -'+ error); }); var a = $(xmlHttpRequest.responseXML).find('WriteOrgResult'); var b = $(xmlHttpRequest.responseXML).find('vstrError'); console.log("a"+a.text()); console.log("b"+b.text()); }
浏览器不允许跨域AJAX调用。仅允许跨域JSONP请求。
要使用JSONP请求,您必须将dataType属性更改为jsonp。但是,这意味着您不能请求XML,而只能请求JSONP。
dataType
jsonp
关于JSONP的一些知识:
该<script>标签绕过跨域限制。这意味着您可以使用该标签从其他服务器获取数据。该标记不支持所有类型的语言,因此不支持XML。
<script>
JSONP本质上是JSON,但是围绕着它的函数调用是这样的:
functionname({"property":"value"})
我可以看到您在想:“那个函数名在那里做什么?”
这与JSON完全不同。由于该函数包装在其中,因此您可以使用实际数据!
<script type="text/javascript"> var functionname = function(json) { alert(json.property); } </script> <script type="text/javascript" src="http://www.domain.com/jsonp"></script>
如果您将第二个脚本标签替换为响应内容,则将很有意义:
<script type="text/javascript"> var functionname = function(json) { alert(json.property); } functionname({"property":"value"}); </script>
信不信由你,但是这种微小的差异实际上使我们能够更安全地进行跨域请求。