python - 使用Python的Requests库,无法调用API来正确格式化

标签 python json api rest python-requests

仅供引用,我是一名新手,正在尝试学习 Python 并使用英国航空公司的 Flight Offer Basic API,其文档可以在此处找到:

https://developer.ba.com/docs/api/Flight_Offer_Basic

使用 docs.python-requests 中的 Requests 库文档,我正在尝试构建 a matching API call这确实有效,但是当不包括我的 API key 和查询所需的参数时(这是有道理的),我得到了 403,但是当我同时包含参数和 API key 时,我得到了 400...这并不'没有意义,除了当我查看我的 API 调用是什么样子以及他们提供的成功示例是什么样子时:

(注意:HTTP:已删除,因为我目前无法发布两个以上的链接)

我的:

//api.ba.com/rest-v1/v1/flightOfferBasic?range=monthLow&departureCity=LON&arrivalCity=NYC&cabin=economy&journeyType=roundTrip

他们的:

//api.ba.com/rest-v1/v1/flightOfferBasic;departureCity=LON;arrivalCity=NYC;cabin=economy;journeyType=roundTrip;range=monthLow.json

已编辑:太平洋标准时间 2015 年 6 月 6 日中午 12:20;我在一些测试中弄乱了代码,但没有意识到我没有恢复它,特别是“journeyType”。

这是我的代码:

import requests
import pprint

parameters = { 'departureCity': 'LON',
            'arrivalCity': 'NYC',
            'cabin': 'economy',
            'journeyType': 'roundTrip',
            'range': 'monthLow'
}

endpoint = 'https://api.ba.com/rest-v1/v1/flightOfferBasic'

headers = {'client-key': 'h6z...'}

response = requests.get(endpoint, params = parameters, headers = headers)
data = response.json

pprint.pprint(data)

我注意到调用中的每个参数都有一个“&”,并且成功的调用有一个“;”加入调用中的每个参数,这似乎就是为什么我收到 400“当消费者向服务发送格式错误的请求时发送。实际的错误消息在响应正文中返回”。

当我检查响应正文时,我被告知:

{"Errors":{"Error":"invalid range"}}

但我已经仔细检查过这是否是正确的键值和字符串。当我删除测试范围时,我被告知“无效舱”。当我移除小屋时,我仍然被告知“无效小屋”。但我已经仔细检查过这是否是小屋的正确键值和字符串。

成功的调用末尾还有“.json”,但我相信“response.json”调用应该将返回的数据转换为 JSON 对象......对吗?另一个奇怪的事情是,然后按照文档的建议将“format”参数作为“.json”传递:

parameters = { 'departureCity': 'LON',
            'arrivalCity': 'NYC',
            'cabin': 'economy',
            'journeyType': 'roundTrip',
            'range': 'monthLow',
            'format': '.json'
}

我得到了 API 调用的 URL:

//api.ba.com/rest-v1/v1/flightOfferBasic?format=.json&arrivalCity=NYC&range=monthLow&journeyType=roundTrip&departureCity=LON&cabin=economy

它作为第一个参数注入(inject),而它应该是最后一个参数,当它也是我的“参数”字典中的最后一个参数时。

知道我哪里出错了吗?

最佳答案

啊啊。这是一个设计得很糟糕的 API。

正如您所注意到的,问题在于他们需要用分号分隔参数。这意味着它们根本不是查询字符串的一部分(这是当您给它一个 params 字典时 requests 所做的事情),而是实际 URL 路径的一部分。

您需要手动构建它,例如通过字符串插值:

parameters = { 'departureCity': 'LON',
            'arrivalCity': 'NYC',
            'cabin': 'economy',
            'journeyType': 'oneWay',
            'range': 'monthLow'
}
path = ';'.join('{}={}'.format(k, v) for k, v in parameters.items())
endpoint = 'https://api.ba.com/rest-v1/v1/flightOfferBasic'    
url = '{};{}'.format(endpoint, path)

response = requests.get(url, headers=headers)

关于python - 使用Python的Requests库,无法调用API来正确格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30686598/

相关文章:

javascript - 在控制台中定义一个 JavaScript 对象

api - Office 365 REST API列表资源( session 室)

python - 如何检查一个二维 NumPy 数组中是否包含特定的值模式?

python - Django:保存到 ModelForm 的 save() 方法中的多对多字段?

json - 如何通过 Gson 获取过滤后的 JSON 节点?

api - 设置服务帐户以授权 Dialogflow

C++高分辨率SYSTEMTIME结构,大于ms?

python - 在字符串中查找特定单词,Python

python - 重命名失败;访问被拒绝的 Tensorflow

jquery - jquery Append() 中的 if 语句