我正在使用Phonegap连接到服务器来验证用户身份。服务器期望数据被Json编码,我将从服务器返回响应。
var serviceURL = "http://appdev/PEPS-CS-Services/";
serviceURL(APPDEV)托管在办公室内的网络上。
var loginData = {
'strUniqueID' : '123',
'UserName' : 'User123',
'Password' : 'Password123'
};
我已经检查了登录凭据,他们没事。当我尝试以下内容时:
$.ajax({
type: "POST",
url: serviceURL + "services/AuthenticationServices/authenticateUser",
data: loginData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
alert(data);
},
failure: function(errMsg) {
alert(errMsg);
}
});
我的控制台出现Access-Control-Allow-Origin
错误。
XMLHttpRequest cannot load http://appdev/PEPS-CS-Services/services/AuthenticationServices/authenticateUser.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost' is therefore not allowed access.
我浏览了一下,建议我在ajax请求中使用Jsonp
作为dataType,这确实可以让我回复我正在寻找的响应。但是,它没有被提醒,控制台会显示带有loginData
变量中使用的参数的网址,如下所示
Resource interpreted as Script but transferred with MIME type application/xml:
http://appdev/PEPS-CS-Services/services/AuthenticationServices/authenticateUser?callback=jQuery164017807046906091273_1396515434941&strUniqueID=123&UserName=Mark&Password=Password1&_=1396515434963"
当我在浏览器中打开链接时,我得到正确的回复,如下所示
<ns:authenticateUserResponse xmlns:ns="http://services">
<ns:return>SESSION ID HERE</ns:return>
</ns:authenticateUserResponse>
但是,我也会在其下面出现Uncaught SyntaxError: Unexpected token <
错误。
我尝试更改为data: loginData
至data: {'data':$.toJSON(loginData)},
,但仍然出现同样的错误。
我的问题如下:
我是否正确发送数据?为什么jQuery164017807046906091273_1396515434941
会在参数之前添加到网址?
为什么我也得到Uncaught SyntaxError
?
这是因为服务器正在发回不正确的数据格式吗?它目前正在发回XML
非常感谢任何帮助,谢谢
答案 0 :(得分:0)
这是一个熟悉的交叉上下文问题,您不能通过简单的ajax调用从另一个域请求资源并期望得到结果。
相反,使用jsonp调用并在返回结果时调用回调函数:
var success = function(data){
/* parse JSON */
data = $.parseJSON(data);
/* show json parsed data */
alert(data);
};
$.ajax({
url: serviceURL + "services/AuthenticationServices/authenticateUser",
dataType: 'jsonp', //use jsonp data type in order to perform cross domain ajax
crossDomain: true,
data: loginData,
success: success,
error: function(errMsg) {
alert(errMsg);
}
});