цель состоит в том, чтобы сделать 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());
Угловой:
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 в Angular.base64_encode
из кода PHP и atob
serializeToString
а также deserializeBinary(bytes)
, что не желательно.<?php
Характеристики:
Если необходима дополнительная информация, просто дайте мне знать в комментариях. Я готов предоставить это. Благодарю.
Задача ещё не решена.
Других решений пока нет …