Can Angular在接收到响应后设置responseType?
我有一个Angular 1.x应用程序,期望通过$http.post()
调用来接收二进制文件下载(pdf)。问题是,我想要另外得到一个处理错误消息,这是作为json发送的。我可以用配置Can Angular在接收到响应后设置responseType?
headers: {
'Accept': 'application/pdf, application/json'
}
问题是我必须要设置responseType: 'arraybuffer'
做到这一点,否则PDF格式的二进制被转义(或改变,使得它不会加载)。但是,这可以防止json被正确读取或解释。
我该怎么做?
编辑:我会尽量澄清;也许我的理解是不正确的。
$http({
method: 'POST',
url: "/myresource",
headers: {
'Accept': 'application/pdf, application/json'
},
responseType: 'arraybuffer'
})
.then(
function(response) {
// handle pdf download via `new Blob([data])`
}, function(response) {
// pop up a message based on response.data
}
)
在我返回一个PDF数据块和为200的HTTP状态的情形下,所述第一函数处理的响应,并且提示用户保存文件。但是,如果状态是错误(422),则response.data
未定义。我认为这是因为responseType
阻止正确处理json。
如果我删除responseType
行,错误数据可以正确读取,但是当保存pdf时,某些文件字节不正确,并且实际上已损坏。我认为这是因为该文件正在编码,因为JavaScript期待一个字符串。
XHR responseType
属性在加载响应后无法更改。但是,一个arraybuffer
可以解码并解析取决于Content-Type
:
var config = {
responseType: "arraybuffer",
transformResponse: jsonBufferToObject,
};
function jsonBufferToObject (data, headersGetter, status) {
var type = headersGetter("Content-Type");
if (!type.startsWith("application/json")) {
return data;
};
var decoder = new TextDecoder("utf-8");
var domString = decoder.decode(data);
var json = JSON.parse(domString);
return json;
};
$http.get(url, config);
上面的例子设置XHR返回一个arraybuffer
和使用transformResponse
功能检测Content-Type: application/json
并在必要时转换。
是的,这是我正在寻找(不明白)。 –
AngularJS $ http使用[XHR API](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest)。 [新的提取API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)可以同时执行或更改。 – georgeawg
不发送服务器错误作为成功数据。将它们作为错误发送。发送一个200错误消息来处理成功只会令API消费者感到困惑。 – Claies
@Claies,我不会将错误发送为200状态(它是422)。 –
@georgeawg,我正在为每个响应设置相应的内容类型。 –