如何使用jQuery ajax dataType的多个值?

时间:2014-09-05 10:41:05

标签: jquery ajax json cross-domain jsonp

我应该以{{1​​}}的形式请求数据来执行跨域请求。但实际返回的结果是json,如jsonp

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

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

但它返回$.ajax({ url: url, type: 'GET', dataType: 'jsonp json', jsonp: false, ... (与parsererror一样)。

我还尝试使用和不使用jsonp进行呼叫:

callback

如何正确处理此类结果?

UPD。我尝试使用$.ajax({ url: url, type: 'GET', dataType: 'jsonp json', cache: true, jsonpCallback: 'callbackFunctionName', jsonp: 'callback', 代替script,效果更好 - 调用jsonp / success函数(而不是done / error) ,但我无法获得回复文字 - 传递给fail的数据为success()以及传递给undefined的{​​{1}}为空。

3 个答案:

答案 0 :(得分:1)

你不能使用多个dataTypes,如果你使用JSONP,它将返回一个jsonp块,你可以使用它调用一个回调来处理这样的返回数据:

Basic example of using .ajax() with JSONP?

您希望返回一个形成为jsonp块的响应,如下所示:

回叫({“q”:“iphone”,“r”:[“iphone 5”,“iphone”,“обменнаiphone”,“iphone 4”,“iphone 5s”]});

从这里开始,您可以使用回调,假设您正在使用带有set callback参数的ajax-call。

答案 1 :(得分:0)

如果需要从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) {}
      });

答案 2 :(得分:0)

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

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

<块引用>

确保响应头——“Content-Type”是文本/纯文本,并且没有明确提供 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;
        };