【问题标题】:How to read RAW JSON in Angular JS from HTTP get method, when response type is arraybuffer?当响应类型为arraybuffer时,如何从HTTP get方法读取Angular JS中的RAW JSON?
【发布时间】:2016-07-03 08:46:00
【问题描述】:

我正在尝试阅读 ByteArray 以使用

将 PDF 表单 Java 显示为 Angular JS
 method : 'GET'
 url        : '',
 cache  : isCache||false,
 responseType: 'arraybuffer'

一切正常时,一切正常。

但是,当我使用一些正确的 JSON 引发异常并将 HTTP 状态标记为错误请求时,即使将配置更改为 respone.config.responseType='application/json',我也无法读取 JSON 响应>.

它在 response.data 上只显示空的 ArrayBuffer {}

但重要的是,我可以在 google chrome 开发者工具请求中看到 JSON 响应。

我用谷歌搜索,搜索堆栈溢出但没有找到太多。

稍后添加以下行

我正在添加响应对象图片和从 chrome 网络连接接收到的数据图片。

第一张图片:来自 Angular JS 的错误函数的响应对象。

第二张图片 - 服务器返回正确的 JSON 消息

第三张图片 - 请求和响应标题图片

我面临的唯一问题是无法读取响应数据,因为我将响应类型设置为 arraybuffer

【问题讨论】:

标签: javascript angularjs json spring-rest


【解决方案1】:

与其期待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
}

您甚至不需要解码数据,只需 create a blob object,然后来自 blob 的 trigger a download

【讨论】:

  • 我接受您的回答,因为它为我提供了另一种方法,可以将 base 64 形式的二进制数据从后端传递到前端,而不是期望数组缓冲区。
【解决方案2】:

如果 responsetype 是 arraybuffer,要查看它,您应该将其转换为 blob 并从该 blob 创建一个 objectUrl,然后下载它或在新的选项卡/浏览器窗口中打开以查看它。

Js:

$http.get('your/api/url').then(function(response) {
var blob = new Blob([response.data], { type: 'application/pdf' });
    var downloadUrl = URL.createObjectURL(blob);

    $timeout(function () {
        var link = document.createElement('a');
        link.download = 'SOME_FILE_NAME'+ '.pdf';
        link.href = downloadUrl;
        link.click();
    }, 100);
}, function(errorResponse){
    alert(errorResponse.error.message);
});

【讨论】:

  • 我可以下载或查看 PDF,问题是当我通过一些异常消息而不是发送二进制数据时。我想显示来自 JSON 而不是二进制的普通文本,因为我想显示错误屏幕上的最终用户。
  • 请检查我添加了一些图片以便更好地理解。
  • 如果您的 API 在收到 400 - Bad Request 响应时返回 JSON,那么我上面的代码应该可以工作并显示来自服务器的错误消息。
  • 它正在调用错误函数,但响应像 arraybuffer 一样为空{}
  • 但是在你的图像中你接收的json?如果出现问题时从服务器获取 arraybuffer,则不能将其读取为 json,因为它不是 json。如果您控制服务器端代码,我建议您将响应更改为包含 2 个属性的对象,如下所示:{ file: theArrayBuffer, message: "some message if an error occurred" }。然后,如果 arrayBuffer 为空,则显示消息。
猜你喜欢
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2019-06-18
  • 2020-09-24
  • 2015-02-01
  • 1970-01-01
  • 2017-12-04
  • 2020-11-07
相关资源
最近更新 更多