Uber API 报告 JSON 对于 /requests/estimates 端点无效

Uber API reports JSON is invalid for /requests/estimates endpoint

我已经为 Heroku 创建了一个 Uber 应用程序的分支

我的叉子:https://github.com/CuriosityGym/Python-Sample-Application

我修改了原始代码和 /price URL 以获取特定产品 ID 的价格估算值,使用此处记录的 /requests/estimates 端点 https://developer.uber.com/docs/riders/references/api/v1.2/requests-estimate-post

@app.route('/price', methods=['GET'])
def price():
"""Example call to the price estimates endpoint.

    Returns the time estimates from the given lat/lng given below.
    """
url = config.get('base_uber_url') + 'requests/estimate'
params = {
    "product_id": "83941b0d-4be1-4979-a9c0-f0af5ee2b89b",
    "start_latitude": config.get('start_latitude'),
    "start_longitude": config.get('start_longitude'),
    "end_latitude": config.get('end_latitude'),
    "end_longitude": config.get('end_longitude')
}
print params
print generate_ride_headers(session.get('access_token'))
response = app.requests_session.post(
    url,
    headers=generate_ride_headers(session.get('access_token')),
    data=params
)


return render_template(
    'results.html',
    endpoint='price',
    data=response.text,
)

这是我使用 1.2 版 Uber Api 的代码片段。其他端点工作正常,这是行不通的。

打印语句打印到 Heroku 日志,这是输出

{'product_id': '83941b0d-4be1-4979-a9c0-f0af5ee2b89b', 'end_longitude': '72.8811862', 'start_latitude': '18.936404', 'end_latitude': '19.0822507', 'start_longitude': '72.832546'}

{'Content-Type': 'application/json', 'Authorization': 'Bearer KA.eyJ2ZXJzaW9uIjkgsdshdJpZCI6IkNmcjAvRzhrUUNPaDNhSnRsUVZ6QlE9PSIsImV4cGlyZXNfYXQiOjE1MTAzMjA3NzgsInBpcGVsaW5lX2tleV9pZCI6Ik1RPT0iLCJwaXBlbGluZV9pZCI6MX0.JDoDTgaYJitK8Rtr35C6gTh5IQc7-P4T7mGg_wOYXu0'}

api报错是

{"message":"Unable to parse JSON in request body.","code":"invalid_json"}

您需要将 json 编码为字符串。幸运的是,requests 可以为您完成此操作,或者您可以使用 json.dumps() 将对象转储为字符串。

这里有两个例子:

要么这样做:

import json

response = app.requests_session.post(
url,
headers=generate_ride_headers(session.get('access_token')),
data=json.dumps(params)

)

或者将其作为 kwarg 传递 json:

response = app.requests_session.post(
    url,
    headers=generate_ride_headers(session.get('access_token')),
    json=params
)