Двоичные данные из PHP в Angular 6 через http - PullRequest
0 голосов
/ 28 декабря 2018

цель состоит в том, чтобы сделать запрос http (пустой) из Angular 7 в PHP для получения двоичных данных в Angular для использования с protobuf3.Более конкретно, двоичные данные (закодированные как описано здесь: https://developers.google.com/protocol-buffers/docs/encoding) в PHP (источник) инкапсулированы в строку, в то время как целью в Angular является Uint8Array.

Поэтому у меня в настоящее время естьследующий рабочий код:

PHP-код (простой корневой шаблон ProcessWire):

header('Content-Type: application/b64-protobuf');
…
echo base64_encode($response->serializeToString());

Angular:

let res = this.httpClient.get(`${this.API_URL}`, { responseType: 'text' });
  res.subscribe((data) => {

  let binary_string = atob(data);
  let len = binary_string.length;
  let bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
    bytes[i] = binary_string.charCodeAt(i);
  }

  let parsedResponse = pb.Response.deserializeBinary(bytes)      
})

Как вы можете видеть, я кодирую данные как base64перед отправкой. Итак, это не так эффективно, как могло бы быть, потому что base64 уменьшает количество информации на символ. Я уже довольно много пытался заставить двоичную передачу работать, но в конце данные всегда искажаются, т.е.переменная bytes не идентична аргументу base64_encode. Но все же, согласно некоторым источникам (например, PHP пишет двоичный ответ , Двоичные данные повреждены из php в AS3 через http (никто не говорит, что это было бы невозможно)) это должно быть возможно.

Итак, мой вопрос: что нужно изменить, чтобы напрямую передавать двоичные данные? Возможно ли это вообще?

Что я пробовал?

  • с использованием различных заголовков, таких как header('Content-Type:binary/octet-stream;'); или с помощью Blob in Angular.
  • Я также пытался удалить base64_encode из кода PHP и atob из углового кода.Результат: содержимое данных изменяется от serializeToString до deserializeBinary(bytes), что нежелательно.
  • Я проверял возможные символы перед <?php

Технические характеристики:

  • PHP 7.2.11
  • Apache 2.4.35
  • Угловой 7.0.2

Если необходима дополнительная информация, простоменя знают в комментариях.Я готов предоставить это.Спасибо.

...