Как читать RAW JSON в Angular JS из метода получения HTTP, когда тип ответа — arraybuffer?

Я пытаюсь прочитать ByteArray, чтобы показать PDF-форму Java в Angular JS, используя

 method : 'GET'
 url        : '',
 cache  : isCache||false,
 responseType: 'arraybuffer'

Это работает нормально, когда все в порядке.

Но когда я выбрасываю исключение с некоторым правильным JSON и помечаю статус HTTP как неверный запрос, я не могу прочитать ответ JSON даже после изменения конфигурации на respone.config.responseType='application/json'.

Он показывает только пустые ArrayBuffer {} в response.data.

Но важно то, что я вижу ответ JSON в запросе инструмента разработчика Google Chrome.

Я гуглил, искал переполнение стека, но ничего не нашел.

Строки ниже добавлены позже

Я добавляю изображение объекта ответа и изображение, полученное с помощью сетевого подключения Chrome.

Первое изображение: объект ответа от функции ошибки углового JS.

введите здесь описание изображения

Второе изображение — сервер возвращает правильное сообщение JSON

введите здесь описание изображения

Третье изображение — изображения заголовка запроса и ответа

введите здесь описание изображения

Единственная проблема, с которой я столкнулся, - это невозможность чтения данных ответа, поскольку я установил тип ответа arraybuffer.


person Viraj    schedule 17.03.2016    source источник
comment
Дубликат stackoverflow.com/questions/30052567/, найдите правильный ответ в этом сообщении   -  person Alberto Rechy    schedule 15.09.2017


Ответы (2)


Вместо того, чтобы ожидать 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, затем запустить загрузку из большого двоичного объекта

person Maposa Takalani    schedule 24.03.2016
comment
Я принимаю ваш ответ, поскольку он дает мне альтернативный способ передачи двоичных данных в форме base 64 из серверной части во внешний интерфейс вместо буфера массива. - person Viraj; 29.03.2016

Если тип ответа — arraybuffer, чтобы просмотреть его, вы должны преобразовать его в большой двоичный объект и создать 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);
});
person aup    schedule 17.03.2016
comment
Я могу загружать или просматривать PDF. Проблема заключается в том, что я получаю какое-то исключение с сообщением вместо отправки двоичных данных. Я хочу показать обычный текст из JSON вместо двоичного, поскольку я хочу отображать ошибку для конечного пользователя на экране. - person Viraj; 17.03.2016
comment
Пожалуйста, проверьте, я добавил несколько фотографий для лучшего понимания. - person Viraj; 17.03.2016
comment
Если ваш API возвращает JSON, когда вы получаете ответ 400 - Bad Request, мой код выше должен работать и отображать ваше сообщение об ошибке с сервера. - person aup; 17.03.2016
comment
Он вызывает функцию ошибки, но ответ компилируется пустым, как arraybuffer{} - person Viraj; 17.03.2016
comment
Но на вашем изображении вы получаете json? Если вы получаете arraybuffer с сервера, когда что-то пошло не так, вы не можете прочитать его как json, так как это не json. Если вы управляете кодом на стороне сервера, я предлагаю вам изменить свой ответ на объект, содержащий 2 свойства, например: { file: theArrayBuffer, message: "some message if an error occurred" }. Затем, если arrayBuffer имеет значение null, вы вместо этого отображаете сообщение. - person aup; 17.03.2016
comment
Я получаю JSON, который я создал для возврата сообщения об ошибке, но из-за того, что тип ответа - массив буфера, я не могу его прочитать. - person Viraj; 17.03.2016