使用Python';s请求库,无法使API调用正确格式化

使用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,因为我现在不能发布超过两个链接) 地雷:

作为参考,我是一名尝试学习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”

这是我的密码:

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,因为我不确定在输出中转义什么,我想说答案很可能是否定的:/非常感谢你的帮助;我想我有点松了一口气,因为我没有发疯!你说得对,每次打这样的电话都很麻烦,但我非常感谢你提供的例子!我将看看这一点,尝试理解您编写的代码的每一部分,然后看看是否可以实际使用它。再次感谢丹尼尔,我真的很感激!