使用Python';s请求库,无法使API调用正确格式化
作为参考,我是一名尝试学习Python并使用英国航空公司Flight Offer Basic API的新手,其文档可在此处找到: 使用docs.python-Requests中的Requests库文档,我试图构建一个实际可行的库,但是当不包含API键和查询所需的参数时,我得到了403(这是有意义的),但当同时包含参数和API键时,我得到了400…这是没有意义的,除了查看API调用的外观以及它们提供的成功示例的外观外: (注意:HTTP:removed,因为我现在不能发布超过两个链接) 地雷: //api.ba.com/rest-v1/v1/flightOfferBasic?范围=月下和出发城市=伦敦和到达城市=纽约和客舱=经济型和旅行型=往返 他们的: //api.ba.com/rest-v1/v1/flightOfferBasic;离港城市=伦敦;到达率=纽约市;客舱=经济舱;行程类型=往返;range=monthLow.json 编辑:太平洋标准时间2015年6月6日下午12:20;我在一些测试中弄糟了代码,没有意识到我没有将其还原回来,特别是“journeyType” 这是我的密码:使用Python';s请求库,无法使API调用正确格式化,python,json,api,rest,python-requests,Python,Json,Api,Rest,Python Requests,作为参考,我是一名尝试学习Python并使用英国航空公司Flight Offer Basic API的新手,其文档可在此处找到: 使用docs.python-Requests中的Requests库文档,我试图构建一个实际可行的库,但是当不包含API键和查询所需的参数时,我得到了403(这是有意义的),但当同时包含参数和API键时,我得到了400…这是没有意义的,除了查看API调用的外观以及它们提供的成功示例的外观外: (注意:HTTP:removed,因为我现在不能发布超过两个链接) 地雷:
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?格式=.json&arrivalCity=NYC&range=monthLow&journeyType=roundTrip&departureCity=LON&cabin=economy
它作为第一个参数被注入,当它应该是最后一个参数时,当它也是我的“参数”字典中的最后一个参数时
知道我哪里出错了吗?啊。这是一个设计糟糕的API 正如您所注意到的,问题在于,它们需要用分号分隔参数。这意味着它们根本不是querystring的一部分,当您给它一个
params
dict时,请求就是这样做的,而是实际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)
您能告诉我您是否在以JSON形式返回时转义输出吗?嘿@prahadnarsinhsonar,因为我不确定在输出中转义什么,我想说答案很可能是否定的:/非常感谢你的帮助;我想我有点松了一口气,因为我没有发疯!你说得对,每次打这样的电话都很麻烦,但我非常感谢你提供的例子!我将看看这一点,尝试理解您编写的代码的每一部分,然后看看是否可以实际使用它。再次感谢丹尼尔,我真的很感激!