цель состоит в том, чтобы сделать запрос 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
Если необходима дополнительная информация, простоменя знают в комментариях.Я готов предоставить это.Спасибо.