【问题标题】:How to use multiple values with jQuery ajax dataType?如何在 jQuery ajax dataType 中使用多个值?
【发布时间】:2014-10-30 07:09:00
【问题描述】:

我应该以jsonp 请求数据以执行跨域请求。但实际返回的结果是像{"q":"iphone","r":["iphone 5","iphone","обмен на iphone","iphone 4","iphone 5s"]}这样的json。

我尝试在dataType 中使用多个值,例如:

$.ajax({
  url: url,
  type: 'GET',
  dataType: 'jsonp json',
  jsonp: false,
  ... 

但它返回 parsererror(与 jsonp 相同)。

我也尝试在有和没有callback的情况下进行通话:

$.ajax({
  url: url,
  type: 'GET',
  dataType: 'jsonp json',
  cache: true,
  jsonpCallback: 'callbackFunctionName',
  jsonp: 'callback',

我该怎么做才能正确处理这样的结果?

更新。我尝试使用script 而不是jsonp,效果更好 - 调用了success/done 函数(而不是error/fail),但我无法获得响应文本 - 数据传递给success()undefined 以及传递给 complete()jqXHR.responseText 是空的。

【问题讨论】:

  • 你的网址是否包含回调函数?
  • 你有没有偶然发现这个:stackoverflow.com/questions/5943630/…
  • @sri,我试过有没有回调函数。
  • @sri,getJSON 可以在这里提供什么帮助?如果我最后用? 传递它,相信它也会期待jsonp 响应。
  • @sri,我已经更新了问题

标签: jquery ajax json cross-domain jsonp


【解决方案1】:

您不能使用多个 dataTypes,如果您使用 JSONP,这将返回一个 JSONP 块,您可以使用该块调用回调来处理返回数据,如下所示:

您想要返回一个形成为 JSONP 块的响应,类似于:

callback({
    "q": "iphone",
    "r": ["iphone 5", "iphone", "обмен на iphone", "iphone 4", "iphone 5s"]
});

从这里你可以使用 callback 假设你正在使用带有 set callback 参数的 AJAX 调用。

【讨论】:

  • 我不能和script一起使用吗?如果我使用script 而不是jsonp,则调用success 函数(而不是error),但我无法获得响应文本 - 传递给datadata 和@987654330 一样未定义传递给complete() 的@ 为空。
  • 我的案例的主要问题 - 服务器返回纯 json,而不是 jsonp 块。所以链接问题中给出的例子也不起作用。
  • 您必须将响应形成为一个 jsonp 块,否则您将得到一个形成为 json 的字符串,但它应该是一个 jsonp 块。
  • 这是第 3 方服务器,所以我无法更改响应。
  • 那你就不能用JSONP了,对不起
【解决方案2】:

如果您需要从 URL 返回多个数据类型,则无需在 jQuery AJAX 调用中传递 dataType

$.ajax({
        type: "GET",
        url: url,
        data: data,
        //dataType: "json",  comment this line
        cache: false,
        beforeSend: function () {},
        success: function (data) {},
        error: function (xhr, ajaxOptions, errorThrown) {}
      });

【讨论】:

    【解决方案3】:

    如前一篇文章所述,您可以完全删除 dataType 属性。在这种情况下,JQuery Ajax 会智能地猜测输出并进行转换。

    https://api.jquery.com/jquery.ajax/ - 数据类型

    确保响应标头 - “Content-Type”是 text/plain,并且 mimeType 未明确提供为 AJAX 选项的一部分。

    ajaxHandleResponses - 将自动尝试根据 mimeType 和 Content-Type 标头检测转换类型。

    function ajaxHandleResponses( s, jqXHR, responses ) {
    
    var ct, type, finalDataType, firstDataType,
        contents = s.contents,
        dataTypes = s.dataTypes;
    
    // Remove auto dataType and get content-type in the process
    while ( dataTypes[ 0 ] === "*" ) {
        dataTypes.shift();
        if ( ct === undefined ) {
            ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
        }
    }
    

    另一种解决方案是使用自定义转换

    根据对 JSON 的响应进行 AJAX 自定义转换,如果响应不是 JSON,则保留为字符串。

    示例代码:

                return $.ajax({
                    type: "GET",
                    url: serviceURL,
                    converters: {
                        'text mycustomtype': (result) => {
                            return this.getResponse(result);
                        }
                    },
                    dataType: 'mycustomtype'
                });
    
            this.getResponse = (result) => {
                let response;
                try {
                    response = JSON.parse(result);
                }
                catch (e) {
                    response = result;
                }
                return response;
            };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2018-08-17
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多