仅供引用,我是一名新手,正在尝试学习 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/