首页 > 解决方案 > 在一个 http 休息请求中发送两个二进制消息

问题描述

我在使用 Python 烧瓶的服务器上运行 REST 服务。我有使用 java 构建的 REST 客户端。我需要在单个 Http REST 请求中发送两条二进制消息。这是两个原因,因为它们都是不同的 protobuff 消息类型,但彼此相互关联,应该进入单个 HTTP 请求。我们如何在发送和接收端实现这一点。

标签: resthttpserializationflaskprotocol-buffers

解决方案


这里最简单的选择可能是简单地声明一个包装消息类型:

message FooRequest {
    // remove "required" if using proto3 syntax
    required Request1MessageType part1 = 1;
    required Request2MessageType part2 = 2;
}

并发送由两个内部消息FooRequest 组成的单个消息。然而,这并不总是可行的,在这种情况下,您必须在二进制有效负载中实现自己的框架机制。一个简单但实​​用的选项可能是测量第一条消息的大小(以字节为单位) - 即len,然后发送:

[len, 4 bytes little endian][message 1, len bytes][message 2]

并在另一端再次解码 - 即取前 4 个字节并使用它来计算两个内部消息的范围。考虑到将来需要更多消息,对每条消息都包含一个长度前缀可能是有意义的(即,还包括消息 2 的长度前缀)——但严格来说,在当前情况下这将是多余的。


推荐阅读