如何在Python中使用Protobuf有效负载发出http请求

Jom*_*ner 5 http protocol-buffers python-3.x

我有一项服务,该服务公开了两个交换API消息(有效载荷)的REST API。到目前为止,我一直使用HTTP / JSON,并且在Python中通过使用request和json包很容易发出带有JSON负载的HTTP请求。我正在努力了解如何发出在有效负载中包含protobuf消息的请求。我认为已经在互联网上进行了足够的搜索,但未获得任何明显的结果。有人经历过吗?她/他可以分享一些例子吗?

具体来说,我有一个message_pb实例化的protobuf消息对象(基于protobuf编译器生成的python代码),并填充了我的数据。

我尝试通过使用请求包发出PUT请求,如下所示:

requests.put(url, data=message_pb, header={'Content-Type': 'application/octet-stream'})
Run Code Online (Sandbox Code Playgroud)

这是我收到的回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 126, in put
    return request('put', url, data=data, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 460, in send
    for i in request.body:
TypeError: 'ObjectStatistics' object is not iterable
Run Code Online (Sandbox Code Playgroud)

小智 6

扎伊采夫·德米特里的评论似乎对我有用。

resp = requests.put(url, headers={'Content-Type': 'application/protobuf'}, data=message_pb.SerializeToString())
Run Code Online (Sandbox Code Playgroud)

  • 这是 protobuf 文档的正确答案:https://developers.google.com/protocol-buffers/docs/pythontutorial#parsing-and-serialization (2认同)