我应该以{{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}}为空。
答案 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;
};