当前位置: 首页 > 知识库问答 >
问题:

ParseFromString解码消息失败

厍建义
2023-03-14

我正在尝试与RESTful API接口,该API在post中接受应用程序/x-protobuf对象。

.原型示例对象:

message register
{
    required string name = 1;
    required int32 id = 2;
}

使用请求,我可以将此消息发布到服务器并收到200。

例如

register = protobuf_pb2.register()
register.name = "foo"
register.id = 1

response = requests.request("POST", url, data=register.SerializeToString(), headers=headers)

当我以SerializeToString()格式查看此有效负载时,它显示类似于

b'\n\t\n\x03foo\x10\x01'

作为健全性检查,然后我可以创建一个新的消息对象和。将其上的ParseFromString()转换为正确的消息格式。

服务器上的第二个uri允许您发送GET请求来检索相同的数据。所以我使用了以下内容:

register = protobuf_pb2.register()
response = requests.request("GET", url, headers=headers).content
register.ParseFromString(response)

响应返回

b'foo:1\n'

ParseFromString返回异常

DecodeError('分析消息时出错',)

我是不是错过了一步?应该。在解析内容负载之前,是否以某种方式对其进行编码?

非常感谢。

共有1个答案

彭展
2023-03-14

您从服务器返回的对象是二进制数据,UTF-8编码,因此Python将其解释为一个字节对象(在Python 3中,字节和str是不同的类型)。

m = b'foo:1\n'
type(m)
Out[1]: bytes

m.decode('utf-8')
Out[2]: 'foo:1\n'

ParseFromString然而需要一个字符串,因此它会抛出一个DecodeError;只需使用具有适当编码的decode()

在响应标题中,您应该能够找到所使用的编码:几乎每个人都使用UTF-8,但在“真实”生产代码中,您也应该检查:在内容类型中(或者您甚至可以使用Accept Charset请求特定的编码,但如果服务器无法满足,您可能会得到406)。

 类似资料:
  • 问题内容: 我有通过base64编码和8bit编码发送的电子邮件。我想知道如何使用imap_fetchstructure检查消息的编码(因为这样做大约两个小时,所以丢失了)然后正确解码。 Gmail和Mailbox(iOS上的应用)以8位发送,而Windows 8的Mail应用以base64发送。无论哪种方式,我都需要通过检测已使用的编码类型来解码其8bit还是base64。 使用PHP 5.1.

  • 我发现了一个有趣的协议缓冲区问题。如果您有两条类似的消息,那么可以使用C API或命令行解析其中一条消息,就像解析另一条消息一样。 ParseFromString的有限文档没有提到它不需要使用所有字符串,如果不使用,它也不会失败。 我原以为ParseFromString无法解析类型为a的消息,如果它显示的是类型为B的消息。毕竟消息包含了额外的数据。然而,事实并非如此。示例脚本演示了该问题: 输出为

  • 这是我的java程序:

  • 问题内容: 我一直试图从PubNub解析此JSON消息,但没有任何运气: 有没有人知道如何在golang中解码这种复杂类型? 问题答案: 简短的答案是,您不能直接将非同类型的JSON数组(按您的示例)解组到golang结构中。 长答案是,您应该为PubNubMessage类型定义一个方法,该方法将JSON字符串解组为an ,然后使用类型断言来确保所需的格式并填充结构。 例如:

  • 我已经下载了json和我的对话档案。我坚持使用奇怪的编码。 json的例子: 应该是这样的: 我正试图这样反序列化它: 不幸的是,输出如下: 有人知道Facebook如何编码json吗?我尝试了几种方法,但没有结果。 谢谢你的帮助。