【问题标题】:Dealing with returned Protocol Buffer Files处理返回的协议缓冲区文件
【发布时间】:2019-12-08 11:58:30
【问题描述】:

我正在向 API 发送获取请求以查找公共交通实时位置。在他们的文档中,他们声明它返回两个协议缓冲区文件。

问题是,我正在用 python 编程,找不到任何关于如何处理这些返回文件的资源。我在网上搜索的有关协议缓冲区文件的大部分信息是如何创建一个(序列化)。

是否有任何示例代码显示如何处理(反序列化?)返回的包含协议缓冲区文件的 get 请求?

抱歉,如果我误解或使用了不正确的术语,请告诉我!

Here 是我能找到的唯一一个说明它返回两个协议文件以及返回内容的结构(?)的文档

【问题讨论】:

  • 你看过这里吗:Protocol Buffer Basics: Python
  • 我做到了,似乎唯一相关的部分是“阅读消息”,但这似乎假设您已经保存了协议文件并了解其内容的格式。我不确定如何管理返回的文件以保存它们,我不知道其内容的格式。

标签: python httprequest deserialization protocol-buffers


【解决方案1】:

第 3.1.1 章。您的链接文档声明数据符合 Google 发布的参考,包括指向相关页面的链接。该页面包含您的数据的 .proto 定义。

3.1.1 GTFS 合规性

GTFS 捆绑包符合 2016 年 2 月 3 日 google 发布的规范参考。GTFS 实时提要也符合 2015 年 2 月 26 日 google 发布的 GTFS 参考。可以找到两个提要组件规范的参考在以下网址:

从网站下载 gtfs-realtime.proto 文件并使用protoc --python_out=. gtfs-realtime.proto 编译它。这将创建一个gtfs_realtime_pb2.py,您可以像这样使用它:

import requests
import gtfs_realtime_pb2

api_key = "<Your API key>"

session = requests.Session()
session.headers.update({"Authorization": "apikey " + api_key})
response = session.get("https://api.transport.nsw.gov.au/v1/gtfs/vehiclepos/nswtrains")
message = gtfs_realtime_pb2.FeedMessage()
message.ParseFromString(response.content)
print(message)

对于这样的输出

header {
  gtfs_realtime_version: "1.0"
  incrementality: FULL_DATASET
  timestamp: 1575847311
}
entity {
  id: "1"
  vehicle {
    trip {
      trip_id: "165.011219.127.0840"
      schedule_relationship: SCHEDULED
      route_id: "4T.C.165"
    }
    position {
      latitude: -28.636098861694336
      longitude: 153.54798889160156
      bearing: 273.8424072265625
    }
    timestamp: 1575847282
    congestion_level: UNKNOWN_CONGESTION_LEVEL
    stop_id: "24811"
    vehicle {
      id: "165"
      label: "08:40am (165)  Casino - Tweed Heads"
    }
  }
}
entity {
  id: "2"
...

【讨论】:

  • 很好的答案,IMO - 非常全面;解释文件的位置,并显示示例用法
【解决方案2】:

Protobuf 不是自描述协议。发布该 API 的人也应该发布架构定义(通常是 .proto 文件),您可以通过现成的工具运行这些定义。向他们询问架构文件(注意:他们还需要告诉您根消息类型是什么)。

请注意,可以从原始有效负载对架构进行逆向工程,但这很耗时,需要了解数据的外观(许多字段可以用多种不同的方式解释)方式,给出不同的结果——你需要知道哪个是“正确的”),并且失去了所有的语义意义(名字等)。如果你能得到 .proto,所有这些都可以避免。如果你不能......我也许可以帮助一些人。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2012-01-21
  • 2014-02-18
  • 1970-01-01
  • 2021-12-19
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多