未使用 JSONP 触发 Jquery 成功函数

IT技术 javascript jquery jsonp
2021-03-16 09:55:55

一直在使用 jQuery 调用我在不同域上的服务。对服务的调用成功(我的调试点被触发),并返回正确的响应(我嗅探流量)。

我的问题主要是成功和失败回调不会被触发。我已经阅读了其他一些关于 SO 的帖子这些帖子表明使用 JSONP 时不会触发错误事件。成功事件是否也是这种情况(可能是因为假设我正在提供我自己的回调函数),或者有没有办法触发我的成功回调。提前致谢。

$.ajax({
  type: "GET",
  url: urlOnDiffDomain,
  async: false,
  cache: false,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  error: function(xhr, ajaxOptions, thrownError) {
   alert('failed....');
  }
}); 
5个回答

好吧。如果将来有人需要知道......事后看来,解决方案可能应该比以前更明显,但您需要将网络响应直接写入响应简单地返回一串 JSON 并不能做到这一点,您需要有人构造它并将其流回。如果您确实这样做了,我原帖中的代码将可以正常工作。

服务代码示例:

public void DoWork()
{
  //it will work without this, but just to be safe
  HttpContext.Current.Response.ContentType = "application/json"; 
  string qs = HttpContext.Current.Request.QueryString["callback"];
  HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}

只是为了明确起见,这是客户端代码。

function localDemo(){
  $.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
    function(data){
      $.each(data, function(i,item){            
        alert(item.x);
      });
  });
}

如果有更好的方法来做到这一点,我全神贯注。对于其他所有人,我知道 WCF 4.0 中有一些对 JSONP 的本机支持的概念。此外,出于安全目的,您可能需要进行一些检查- 尽管我没有进行太多调查。

出于好奇:当您没有将字符串写入响应流时,您是如何“返回”字符串的?
2021-04-22 09:55:55
如果您使用回调包装 JSON 数据,我认为内容类型不是 application/json。我使用文本/javascript。
2021-04-22 09:55:55
谢谢帮我解决的兄弟。
2021-04-23 09:55:55
在 .NET 中制作 JSONP 服务的最简单方法是使用 HTTP 处理程序,然后没有页面标记要抑制,您只需写入响应流。
2021-05-06 09:55:55
同意古法。删除 WCF 为您提供的默认 JSON 包装器也无济于事。您可以解决它,但这只是要记住的另一件事A:通过天真地做返回“东西”;
2021-05-12 09:55:55

success当服务器响应回调方法被调用。$.ajax方法设置了一个函数,通过调用success回调方法来处理响应

success未调用方法的最可能原因是来自服务器的响应不正确。$.ajax方法在callback查询字符串中发送一个值,服务器应将其用作 JSONP 响应中的函数名称。如果服务器使用不同的名称,$.ajax则永远不会调用方法设置的函数

如果服务器无法使用callback查询字符串中的值来设置响应中的函数名称,您可以指定该$.ajax方法应该从服务器获得的函数名称将属性添加jsonpCallback到选项对象,并将值设置为服务器在响应中使用的函数的名称。

例如,如果该$.ajax方法使用 URLhttp://service.mydomain.com/getdata?callback=jsonp12345向服务器发送请求,则服务器应响应如下所示:

jsonp12345({...});

如果服务器忽略callback查询字符串,而是响应如下:

mycallback({...});

然后,您必须通过向选项对象添加属性来覆盖函数名称:

$.ajax({
  url: urlOnDiffDomain,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  jsonpCallback: 'mycallback'
});
@rhythmaddict:您使用的是哪个版本的 jQuery?您需要 1.4 或更高版本才能使用 jsonpCallback 属性。但是,当您更改服务器代码以正确使用回调查询字符串时,您不需要使用 jsonpCallback 属性。
2021-04-24 09:55:55
我已经更改了从我的服务返回的值。现在看起来像这样: string qs = HttpContext.Current.Request.QueryString["callback"]; return qs + "({'d':'s'})"; 鉴于以下客户端代码: var url = ' some.other.domain/service/serviceName.svc/param1/1/param2/2 '; $.ajax({ url: url, dataType: 'jsonp', data: {}, jsonpCallback: 'mycallback', success: function(data, textStatus) { alert(data); } }) 响应内容如下:“jsonp1267721964115({'d':'s'})” 尽管有属性,它似乎附加了一个回调函数?
2021-05-17 09:55:55

尝试

$.getJSON(urlOnDiffDomain, function(data, textStatus){
    alert('success...');
});

通常对我有用。您需要添加 &callback=? 到 urlOnDiffDomain,其中 jQuery 自动替换 JSONP 中使用的回调。

不触发错误回调,但是可以使用全局$.ajaxError,像这样

$('.somenode').ajaxError(function(e, xhr, settings, exception) {
    alert('failed');
});
服务返回字符串的方式与我在上面的第一条评论中指出的相同。如果我的 URL 以 &callback=? 结尾,我会得到一个 http 403。如果我以 ?callback=? 结尾,我就可以访问服务,但是我的成功事件仍然没有被触发:-? (Jquery 确实创建了 JSONPXXXX 函数)
2021-04-22 09:55:55

这不是您问题的完整答案,但我认为路过的人想知道这一点:

当您从 WCF REST处理JSONP 时,请尝试使用:

[JavascriptCallbackBehavior(UrlParameterName = "$callback")]

为您的服务实施;这应该为您提供开箱即用的 JSONP。

    $.ajax({
                url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>',
                dataType: "json",
                data: {
                    featureClass: "P",
                    style: "full",
                    maxRows: 12,
                    artist: request.term
                },
                success: function( data ) {
                    response( $.map( data, function( item ) {
                        return {
                            label: item.artist,
                            value: item.artist,
                            id: item.id
                        }
                    }));
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    alert(thrownError);
                  }
            });
发布答案时,不要只提供代码。请解释您的代码将做什么或它与原始海报示例有何不同。如果您可以向原始海报解释它,那么答案将最有效,以便他们了解它在做什么。
2021-04-25 09:55:55