作者:罗然8_907 | 来源:互联网 | 2022-12-31 17:16
我的WebApp需要通过ProtBuf与我的服务器通信。为此,我需要能够发布原始二进制数据。
这是我现在正在使用的代码。这个问题是HttpClient
将Uint8Array编码为JSON数组,因此结果不再是有效的原型缓冲区:
const message = LoginRequest.fromObject({
code: code,
username: username,
password: password
});
const buffer: Uint8Array = LoginRequest.encode(message).finish();
this.http.post('https://api.myserver.com', buffer)
.subscribe(/*...*/);
HttpClient.post
接受一些选项,在这里可以设置responseType
到json
,text
,blob
或arraybuffer
。但这只是设置了预期的响应类型,请求的主体仍被编码为JSON。
是否HttpClient
可以发送未编码的正文?
编辑:这是我在服务器上收到的正文:
{"0":10,"1":3,"2":97,"3":98,"4":99,"5":18,"6":5,"7":97,"8":100,"9":109,"10":105,"11":110,"12":26,"13":8,"14":112,"15":97,"16":115,"17":115,"18":119,"19":111,"20":114,"21":100}
1> Estus Flask..:
从参考资料中可以看出,请求的类型body
为any
,这表明它是自由格式的。HttpClient
用于HttpRequest
表示请求,使用serializeBody
方法转换请求主体:
将自由格式的主体转换为适合传输到服务器的序列化格式。
它接受多种身体类型,所有身体类型都相应地进行了字符串化处理。原体有望成为Blob
,ArrayBuffer
或者一个字符串。因此Uint8Array
应将其转换为其中之一,例如:
const arr: Uint8Array = LoginRequest.encode(message).finish();
const buffer: ArrayBuffer = arr.buffer;