gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:11 24 4
gpt4 key购买 nike

作为引用,我是一名尝试学习 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 PST;我在一些测试中弄乱了代码,却没有意识到我没有将其还原,特别是“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对象……对吧?另一件奇怪的事情是,然后按照文档的建议将“格式”参数作为“.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 字典时所做的,而是实际 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com