我试图访问另一个域中的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。
关于JSONP的一些信息:
<script>
标签绕过了跨域限制。这意味着您可以使用该标签从其他服务器获取数据。该标记不支持所有类型的语言,因此不支持XML。
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>
信不信由你,但这个微小的差异实际上使我们能够使跨域请求更加安全。
关于JSONP 的另一个线程
对于使用Javascript的跨域通信,您需要使用本地代理将请求传递到外部域,或者使用带填充的JSON(也称为JSONP)。
如果外部网站提供了使用JSONP的可能性,那么就去吧。如果没有,请考虑在Web应用程序和远程服务器之间创建一个代理。