编码 protobuf serializeBinary 响应以通过 http post 正文发送它的正确方法是什么?
What is the right way to encode a protobuf serializeBinary response to send it over http post body?
我正在尝试通过 http post 将 protobuf 从节点 js 客户端发送到 java spring 服务器。
message.serializeBinary()
给了我一个 uint8 字节数组,我试图用 new StringDecoder('utf8').write(<bytes>)
对其进行编码。我用 npm request-promise:
将它发送到 post
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 传输协议缓冲区。或者如果我做错了什么,也请指出。
tl;dr 解决办法是把qs改成form
const options = {
uri: <some url>,
method: 'POST',
form: {
'attr1': 'value1',
'attr2': new StringDecoder('utf8').write(message.serializeBinary())
}
}
问题是将编码的 protobuf 作为查询字符串参数传递,这是 url 的一部分。 Url 有基于浏览器的可变长度限制,最好将其作为表单数据传递。参见 What is the maximum length of a URL in different browsers?
我正在尝试通过 http post 将 protobuf 从节点 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 传输协议缓冲区。或者如果我做错了什么,也请指出。
tl;dr 解决办法是把qs改成form
const options = {
uri: <some url>,
method: 'POST',
form: {
'attr1': 'value1',
'attr2': new StringDecoder('utf8').write(message.serializeBinary())
}
}
问题是将编码的 protobuf 作为查询字符串参数传递,这是 url 的一部分。 Url 有基于浏览器的可变长度限制,最好将其作为表单数据传递。参见 What is the maximum length of a URL in different browsers?