GET请求'接受:* / *'标头导致406.是否可以删除它?

时间:2017-05-16 04:22:10

标签: javascript ajax api http http-headers

我试图从API中获取文件的二进制数据;我必须使用 JavaScript 发出此请求,而我无法以任何方式修改API。

我目前正在使用以下方法;

function getUserFile() {
        $.ajax({
            type: 'GET',
            url: userData.file.link,
            beforeSend: function(request) {
                request.setRequestHeader('Accept', 'application/octet-stream');
                request.setRequestHeader('Authorization', 'Bearer ' + authToken);
            },
            contentType: 'application/json',
            success: function(data) {
                // Do something with data
            },
            error:  function(errorThrown) {
                console.log(errorThrown);
            }
        });
    }

当我从浏览器内部触发此请求时,它会失败并返回406.这是因为浏览器(我相信?)正在将*/*值添加到我的Accept标头中。它必须包含application/octet-stream才能接受请求。

是否可以删除此额外标头值,或者首先禁止将其添加到请求中?

修改 通过JSFiddle运行this和真正的API调用不会将*/*值附加到Accept标头。从标准HTML文档运行相同的代码会添加该值。这两个有什么不同可能导致一个而不是另一个省略值?

修改 有问题的aspx页面正在运行JQuery 1.5.x或1.8.x

1 个答案:

答案 0 :(得分:0)

虽然这不是为什么会发生这种情况的答案,但我找到了解决问题的有效方法。

代替isd-stations,sources,units ,isd,si 476490-99999, 476510-99999, 476630-99999, 476840-99999, ... 来电,我可以使用$.ajax()

XMLHttpRequest

'默认'标头值仅附加到我的ajax调用;特别是仅由某些var request; request = new XMLHttpRequest(); request.addEventListener("load", getComplete); request.open('GET', userData.file.link); request.setRequestHeader('Content-type', 'application/json'); request.setRequestHeader('Accept', 'application/octet-stream'); request.setRequestHeader('Authorization', 'Bearer ' + authToken); request.send(); 页面制作的那些。

如果我从.aspx记录请求,则此默认标头值已存在。在项目的某个地方,一个设置或一块JS导致ajax调用初始化为beforeSend:标头值为Accept

项目中没有*/*,使用$.ajaxSetup({ ... });没有任何区别。我的假设是这些页面使用的JQuery文件包含影响delete $.ajaxSettings.headers["Accept"];的修改。

修改 我设法追踪这部分asp.NET项目正在使用的ajaxSettings文件。进行JQuery调用时,此JQuery文件已被修改为包含某些默认值。这就是使用AJAX的直接方法成功的原因。