我正尝试通过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传输协议缓冲区的编码。或者,如果我在做其他错误的事情,也请指出来。
答案 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?