当空响应

时间:2016-11-16 15:48:34

标签: javascript jquery ajax

我在后端有一个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。 如果服务器在响应主体中返回了某些内容,则可以正常工作。

不确定我错过了什么。

2 个答案:

答案 0 :(得分:2)

Jquery 1.9将带有空结果的json ajax请求视为失败。

  

以严格的方式解析JSON数据;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。从jQuery 1.9开始,空响应也被拒绝;服务器应该返回null或{}的响应。 (有关正确的JSON格式的更多信息,请参阅json.org。)

您应该将其作为fail案例处理,不要使用json类型,或者修改服务器以在请求json时不发送空响应。

答案 1 :(得分:0)

解决方案:

  1. 将 AJAX 数据类型更改为“文本”-(即使 JSON 响应也会被视为文本)。

    $.ajax({
    type: "GET",
    url: serviceURL,
    dataType: 'text'
    

    });

  2. 不要为 $.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" );
    }
}
  1. 根据对 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;
        };
  1. 始终从服务器传递 JSON 响应。作为空 JSON - {} 或具有空数据的属性结果(我的首选解决方案 考虑到大部分响应将是 JSON

    {"result":""}