2012-01-13 241 views
6

我试图访问另一个域中的web服务,它什么都没有返回。后来我发现这是一个跨域访问的问题。Jquery跨域问题

我在网上搜索,有这么多的文章,但没有人可以像我这样的新手可读。 :(

有人可以帮助我如何访问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="[email protected]"; 
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()); 
} 
+0

你能够做到这一点吗? – 2013-01-02 12:28:07

回答

5

浏览器不允许跨域AJAX调用。只有跨域JSONP请求是允许的。

要使用JSONP请求,您必须将dataType属性更改为jsonp,这意味着无论你不能要求XML,但只有JSONP。


约JSONP的位:

<script>标签绕过跨域限制。这意味着您可以使用该标签从其他服务器获取数据。该标签不支持各种语言,因此不支持XML。

JSONP基本上是JSON,但它周围的函数调用是这样的:

functionname({"property":"value"})

我能看到你想知道:“那是什么functionname在那里做什么”

这与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> 

信不信由你,但这种微小的差别实际上使我们能够跨域要求更安全。

Another thread about JSONP

3

对于使用Javascript,你需要或者使用本地代理的请求传递到外部域或使用JSON与填充又名JSONP跨域通信。

如果外部网站提供了使用JSONP的可能性,那就去吧。如果没有,请在您的Web应用程序和远程服务器之间查看creating a proxy