使用Python的Requests库,无法获得API调用以正确格式化

时间:2015-06-06 19:11:42

标签: 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密钥而只是查询的必要参数(这是有意义的),但当我包含参数和API密钥时,这是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)

我注意到我有一个"&"加入呼叫中的每个参数,成功呼叫有一个&#34 ;;"加入呼叫中的每个参数,这似乎是当消费者向服务发送格式错误的请求时发送400"发送的原因。实际的错误消息在响应正文中返回"。

当我检查回复的正文时,我告诉过:

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

但是,我已经检查了那个正确的键值和字符串。当我删除要测试的范围时,我告诉"无效的机舱"。当我卸下客舱时,我仍然告诉"舱室无效"。但我已经检查过双重和三重检查,确认这是机舱的正确键值和字符串。

成功的电话也有" .json"最后,但我相信" response.json" call应该将返回的数据转换为JSON对象......对吗?另一个奇怪的事情是,然后传递"格式"参数为" .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

它作为第一个参数注入,它应该是最后一个参数,当它是我的参数"中的最后一个参数时。字典也是。

知道我哪里出错了吗?

1 个答案:

答案 0 :(得分:2)

哎呀。这是一个设计糟糕的API。

正如您所注意到的,问题是他们希望参数以分号分隔。这意味着它们根本不是查询字符串的一部分,这就是当你给它一个cvs字典时请求所做的,但它是实际URL路径的一部分。

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

params