Can Angular在接收到响应后设置responseType?

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期待一个字符串。

+0

不发送服务器错误作为成功数据。将它们作为错误发送。发送一个200错误消息来处理成功只会令API消费者感到困惑。 – Claies

+0

@Claies,我不会将错误发送为200状态(它是422)。 –

+0

@georgeawg,我正在为每个响应设置相应的内容类型。 –

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并在必要时转换。

DEMO on PLNKR

+0

是的,这是我正在寻找(不明白)。 –

+0

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