PhoneGap - 发送JSON编码数据错误

时间:2014-04-03 09:09:30

标签: javascript jquery ajax json cordova

我正在使用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: loginDatadata: {'data':$.toJSON(loginData)},,但仍然出现同样的错误。

我的问题如下:

我是否正确发送数据?为什么jQuery164017807046906091273_1396515434941会在参数之前添加到网址?

为什么我也得到Uncaught SyntaxError

这是因为服务器正在发回不正确的数据格式吗?它目前正在发回XML

非常感谢任何帮助,谢谢

1 个答案:

答案 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);
  }
});