我在后端有一个POST服务,它返回一个空响应体。
我用来自jquery的ajax调用来调用服务,这样会返回一个promise:
return $.when($.ajax({
type: 'POST',
url: url,
beforeSend: (xhr) => {
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8')
},
data: data,
dataType: 'json',
crossDomain: true
}))
然后调用方法:
myMethod(params).done(
(response) => {
console.log(response)
}
)
所以进行了ajax调用,但是,从未运行过done。 如果服务器在响应主体中返回了某些内容,则可以正常工作。
不确定我错过了什么。
答案 0 :(得分:2)
Jquery 1.9将带有空结果的json ajax请求视为失败。
以严格的方式解析JSON数据;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。从jQuery 1.9开始,空响应也被拒绝;服务器应该返回null或{}的响应。 (有关正确的JSON格式的更多信息,请参阅json.org。)
您应该将其作为fail
案例处理,不要使用json
类型,或者修改服务器以在请求json时不发送空响应。
答案 1 :(得分:0)
解决方案:
将 AJAX 数据类型更改为“文本”-(即使 JSON 响应也会被视为文本)。
$.ajax({
type: "GET",
url: serviceURL,
dataType: 'text'
});
不要为 $.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" );
}
}
示例代码:
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;
};
始终从服务器传递 JSON 响应。作为空 JSON - {} 或具有空数据的属性结果(我的首选解决方案 考虑到大部分响应将是 JSON)
{"result":""}