【问题标题】:Uber API reports JSON is invalid for /requests/estimates endpointUber API 报告 JSON 对于 /requests/estimates 端点无效
【发布时间】:2018-03-23 05:46:29
【问题描述】:

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

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

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

@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,
)

这是我使用 Uber Api 1.2 版本的代码的 sn-p。其他端点工作正常,它的这个不起作用。

打印语句打印到 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":"无法解析请求正文中的 JSON。","code":"invalid_json"}

【问题讨论】:

  • JSON 不允许使用单引号。
  • ...顺便说一句,您真的在这里发布了您的访问令牌吗?
  • 不,访问令牌已被修改。
  • 我的代码有双引号,我想知道它们是怎么变成单身的。

标签: python json heroku uber-api


【解决方案1】:

您需要将 json 编码为字符串。幸运的是,请求可以为您执行此操作,或者您可以使用 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
)

【讨论】:

  • 我都试过了,第一个解决方案效果很好。除了提到的更改之外,我将 params json 中的所有双引号都更改为单引号。
猜你喜欢
  • 2018-03-06
  • 2015-06-27
  • 2018-07-24
  • 2018-08-15
  • 1970-01-01
  • 2015-05-29
  • 2017-01-02
  • 2017-04-23
  • 2016-08-02
相关资源
最近更新 更多