当使用带有 python 的 Web 端点
requests
来通过 Google Cloud 计算路由时,https://routes.googleapis.com/directions/v2:computeRoutes
,我得到了 json 格式的响应。
这就是我使用 python 构建请求的方式,它使我能够更好地处理收到的数据。
headers = {
'Content-Type': 'application/json',
'X-Goog-Api-Key': API_KEY,
'X-Goog-FieldMask': 'routes.duration,routes.distanceMeters,routes.legs,routes.optimizedIntermediateWaypointIndex,geocodingResults',
}
data = {
'origin': {
'placeId': ORIGIN_ID
},
'destination': {
'placeId': DESTINATION_ID
},
'intermediates': intermediates,
'travelMode': 'DRIVE',
'routingPreference': 'TRAFFIC_AWARE',
'departureTime': '2024-07-06T10:00:00Z',
'computeAlternativeRoutes': False,
'optimizeWaypointOrder': True,
'units': 'METRIC',
}
response = requests.post('https://routes.googleapis.com/directions/v2:computeRoutes', headers=headers, json=data, timeout=25)
我想直接使用 python 库,但是 API 的响应以 protobuff 消息的形式出现,当尝试将响应保存为 Json 时,我收到错误:
TypeError: Object of type ComputeRoutesResponse is not JSON serializable
这就是我在 python 中构建请求的方式:
routes_client = RoutesClient()
route_response = routes_client.compute_routes(
ComputeRoutesRequest(
destination=Waypoint(
address=DESTINATION_PLUS_CODE
),
origin=Waypoint(
address=ORIGIN_PLUS_CODE
),
intermediates=intermediates,
travel_mode='DRIVE',
region_code='US',
routing_preference='TRAFFIC_AWARE',
departure_time=datetime.now(tz=timezone('America/Los_Angeles'))+timedelta(days=1),
compute_alternative_routes=False,
units='METRIC',
optimize_waypoint_order=True,
),
metadata=[("x-goog-fieldmask", ','.join(field_mask))]
)
我尝试将
("content-type", 'application/json')
添加到元数据,但也不起作用。
我可以做什么来序列化结果,以便我可以保存它以供以后处理。
我进一步调查了。
用于 Python 使用的 Google Cloud 客户端库
proto-plus
proto-plus
包含 序列化 方法,因此您可以:
route_response = ...
ComputeRoutesResponse.to_json(route_response)
to_json
进行额外的格式化工作,但本质上是:
route_response = ...
msg = ComputeRoutesResponse.pb(route_response)
j = MessageToJson(msg)
print(j)