编码protobuf serializeBinary响应以通过HTTP帖子正文发送的正确方法是什么?

时间:2019-05-16 01:31:05

标签: node.js spring encoding utf-8 http-post

我正尝试通过http帖子将protobuf发送到Node js客户端的java spring服务器。

message.serializeBinary()给了我一个uint8字节的数组,我尝试用new StringDecoder('utf8').write(<bytes>)进行编码。我通过npm request-promise通过邮件发送它:

 const request = require('request-promise')
 const options = {
  uri: <some url>,
  method: 'POST',
  qs: {
    'attr1': 'value1',
    'attr2': new StringDecoder('utf8').write(message.serializeBinary())
  }
}
request(options).then(console.log).catch(console.log)

这会影响Spring服务器端点

@ResponseBody String endpoint(@RequestParam String attr1, @RequestParam String attr2) {
  // This is raising InvalidProtocolBufferException
  var message = Message.parseFrom(attr2.getBytes(StandardCharsets.UTF_8));  
}

给我一​​个编码问题,我不确定用于通过HTTP传输协议缓冲区的编码。或者,如果我在做其他错误的事情,也请指出来。

1 个答案:

答案 0 :(得分:1)

tl; dr解决方案是将qs更改为形式

const options = {
  uri: <some url>,
  method: 'POST',
  form: {
    'attr1': 'value1',
    'attr2': new StringDecoder('utf8').write(message.serializeBinary())
  }
}

问题正在将编码的protobuf作为查询字符串参数传递,这是url的一部分。网址具有基于浏览器的可变长度限制,最好将其作为表单数据传递。参见What is the maximum length of a URL in different browsers?