node.js - 编码 protobuf serializeBinary 响应以通过 http post body 发送它的正确方法是什么?
问题描述
我正在尝试从节点 js 客户端通过 http post 向 java spring 服务器发送一个 protobuf。
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 有基于浏览器的可变长度限制,最好将其作为表单数据传递。请参阅不同浏览器中 URL 的最大长度是多少?
推荐阅读
- nunit - 如何在运行时获取 nunit 过滤器?
- c - 如何在 C 中 fork&exec bash shell?
- javascript - 如何将此 Object.values 除以总数?
- swift - 在组合中模拟错误响应以测试错误处理
- javascript - Django:request.is_ajax() 返回 False
- python - 在 Seaborn 组合折线图中添加图例
- javascript - 想在递归javascript中使用异步函数
- apache-kafka - 为客户服务设计基于事件的架构
- android - 相当于 Jetpack Compose Lazy Column/Row 中的 adapter.notifydatasetchange 或 Diffutils
- android - 无法运行反应本机应用程序android模拟器