2012-08-04 31 views
1

Ahoy!

我正在使用WCF服务来处理来自单独域上的Web服务器(因此使用JSONP)的Ajax调用。我的电话是这样的:

$.ajax({ 
    dataType: 'jsonp', 
    type: 'GET', 
    url: 'http://localhost/s.svc/login?callback=?&l=en&e=foo&p=bar', 
    success: function (serverData) { 
     // [...] 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     // [...] 
    } 
}); 

我从服务器得到的回应是这样的:

?({"DataIsValid":true,"ErrorOccurred":false,"EmailAddressValidationMessage":"","PasswordValidationMessage":""}); 

和jQuery随后读取数据时,它抛出一个parsererror

上面的响应看起来像有效的JSON,并且根据文档,我认为“?callback =?”适用于使用JSONP的$ .ajax调用。

在此先感谢您指出我所缺少明显:-)

回答

2

一对夫妇的事情,我在这里看到:

  1. 在URL中摆脱回调的参数。创建jQuery JSONP调用会添加自己的回调函数,并且您的成功/错误函数将被调用。在后端,从请求中读取“callback”参数,并用它来包装你的jsonp响应(你已经这么做了,所以不要改变那部分)。
  2. 当你进入你的成功功能,serverData将是一个字符串。与jQuery.parseJSON()JSON.parse()解析它:

VAR数据= jQuery.parseJSON(serverData); //或使用 JSON.parse(serverData);

这应该做到这一点。

最后一件事。如果你开始在解析中得到“Unexpected token ...”错误,那么你的JSON字符串中可能会隐藏一个控制字符。我有这个问题,它是一个换行符(“\ n”)。计算出它是通过获取字符串中类似Chrome的开发工具的控制台来解析的字符,然后替换:

var data = jQuery.parseJSON(serverData.replace(/\n/g,"")); 
+0

如何用回应包装回调参数?你的意思是做一个$回调。'({'。$ jsonResponse。'})'; ? – PinoyStackOverflower 2014-05-20 08:19:53

+1

@PinoyStackOverflower - 抱歉需要一段时间才能找回。回调参数包含前端存在的回调的函数名称。 jQuery在jsonp请求中包含它。所以你可以从服务器上的请求中读取'callback'参数,然后对于客户端的响应,你会返回一个像'callbackParameterValue +'('+ JSON.stringify(serverData)+')'这样的字符串。然后,jQuery将得到响应并将其传递给成功函数,此时您需要将其解析为JSON,如上所述。 – mpickell 2014-08-28 17:34:44

+0

嗨@mpickell,您能否通过编辑Adam的代码发布包含您的建议的完整代码。这会更有帮助。谢谢! – Bhargav 2016-12-06 05:40:41

0

我在MVC操作方法响应低于失踪(包装在回调方法的效应初探)。

response.Write(request.Params["callback"] +"(" +htmlContent +");"); 

和jquery ajax调用应该像下面那样。

jQuery.ajax({ 
      url:"https://servername/virtualDirectory/ActionMethod,    
      crossDomain: true, 
      dataType: 'jsonp',     
      type: 'GET', 
      cache: false, 
      jsonp:"callback",    
      success: function (data) { 
       alert('success');     
       $fs("#fs_container").htm(data);     
      }, 
      error: function (data, status, req) {       
       alert(req.responseText + " " + status); 
      }     
});