Angular 5 HttpClient 发送原始二进制数据的 POST 请求

5

我的WebApp需要通过ProtBuf与服务器通信。为了实现这一点,我需要能够发布原始二进制数据。

目前我正在使用的代码是这样的。问题在于HttpClient将Uint8Array编码为JSON数组,结果不再是有效的protobuf:

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设置为jsontextblobarraybuffer。但这只是设置了响应的预期类型,请求正文仍然以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}

2个回答

11
正如在参考资料中所看到的,请求的body类型为any,这表明它是自由格式的。 HttpClient使用HttpRequest表示请求,它使用serializeBody方法来转换请求体:

将自由格式的请求体转换为适合传输到服务器的序列化格式。

它接受多种请求体类型,所有类型都会相应地被字符串化。 原始体预计为BlobArrayBuffer或字符串。 因此,Uint8Array应该被转换为其中之一,例如:

const arr: Uint8Array = LoginRequest.encode(message).finish();
const buffer: ArrayBuffer = arr.buffer;

在 https://dev59.com/w2oy5IYBdhLWcg3wWss_ 给出的答案解决了我的问题。 - toongeorges

0

这对我有用

this.httpClient.post('.../service/', new Blob([gzip(JSON.stringify(obj))]), 

它用于A7应用程序中,尽管代码仍然包含相同的注释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接