Javascript 当响应类型为arraybuffer时,如何从HTTP get方法读取Angular JS中的原始JSON?
我正在尝试阅读ByteArray,以便使用Javascript 当响应类型为arraybuffer时,如何从HTTP get方法读取Angular JS中的原始JSON?,javascript,angularjs,json,spring-rest,Javascript,Angularjs,Json,Spring Rest,我正在尝试阅读ByteArray,以便使用 method : 'GET' url : '', cache : isCache||false, responseType: 'arraybuffer' 当一切正常时,这工作正常 但当我抛出一个带有正确JSON的异常并将HTTP状态标记为错误请求时,即使在将config更改为respone.config.responseType='application/JSON'之后,我也无法读取JSON响应 它在response.data
method : 'GET'
url : '',
cache : isCache||false,
responseType: 'arraybuffer'
当一切正常时,这工作正常
但当我抛出一个带有正确JSON的异常并将HTTP状态标记为错误请求时,即使在将config更改为respone.config.responseType='application/JSON'之后,我也无法读取JSON响应
它在response.data上只显示空的ArrayBuffer{}
但重要的是,我可以在GoogleChrome开发者工具请求中看到JSON响应
我在谷歌上搜索了堆栈溢出,但没找到多少
后面添加的行下方
我正在添加从chrome网络连接接收到的响应对象图片和数据
第一幅图:angular JS的错误函数的响应对象
第二个映像-服务器返回正确的JSON消息
第三个图像-请求和响应头图片
我面临的唯一问题是无法读取响应数据,因为我将响应类型设置为arraybuffer如果响应类型为
arraybuffer
,要查看它,您应该将其转换为blob并从该blob创建objectUrl,然后下载它或在新选项卡/浏览器窗口中打开以查看它
Js:
与其一直期待
arraybuffer
为什么不期待application/json
,不如在返回本应创建pdf的数据时,对数据进行base64排序,将其放入json对象并返回给客户端
即使抛出异常,您仍然希望看到JSON
。服务器端的响应可能类似于:
{
responseCode: // your response code according to whether the request is success or not,
responseMessage: // success or fail
data: // your base64 encoded pdf data(the data that if the request is successful will be returned), note it will be returned as a normal string
} // I'm hoping you know how to base64 encode data
然后在客户端(Javascript)中,执行if
if(data.responseCode == //errorCode) {
alert(data.responseMessage);
} else {
// Unpack data
var myPdfData = // base64 decode(data.data)
// Do logic to create and open/download file
}
你甚至不需要解码数据,你只要,然后从blob我就可以下载或查看PDF,问题是当我通过一些异常消息而不是发送二进制数据时。我想显示JSON的正常文本而不是二进制文本,因为我想在屏幕上向最终用户显示错误。请检查我添加了一些图片以便更好地理解。如果你的API在收到400错误的请求响应时返回JSON,那么我上面的代码应该可以工作,并显示来自服务器的错误消息。它正在调用错误函数,但是响应是空的,就像arraybuffer{},但是在您的图像中,您接收到的是json吗?如果在出现问题时从服务器获取arraybuffer,则不能将其作为json读取,因为它不是json。如果您控制服务器端代码,我建议您将响应更改为包含两个属性的对象,如:
{file:theArrayBuffer,message:“发生错误时的消息”}
。然后,如果arrayBuffer为null,则显示消息。我接受您的答案,因为它提供了另一种方法,可以将base 64格式的二进制数据从后端传递到前端,而不需要数组缓冲区。在该帖子中找到正确答案的副本
if(data.responseCode == //errorCode) {
alert(data.responseMessage);
} else {
// Unpack data
var myPdfData = // base64 decode(data.data)
// Do logic to create and open/download file
}