我试图从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
答案 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
的直接方法成功的原因。