了解 Python HTTP 请求中的 428 状态代码
使用Python时 要求 模块中,通常会遇到 HTTP 状态代码,这些状态代码表示服务器应答存在各种困难。其中一个错误是 428 状态代码,它指示服务器在继续操作之前必须满足的条件。这通常是由于未能提供所需的标头或未能按正确的顺序执行请求造成的。
在这种情况下,用户尝试发送 邮政 向网站发出请求,但收到 428 响应,而不是预期的 200 状态代码。该脚本包含正确构造的有效负载和标头,但缺少一个重要组件,导致请求失败。
与在线 API 交互时,此类错误很常见,尤其是当服务器在处理请求之前需要额外的条件时。了解 428 状态代码的根本原因对于解决问题和提供成功的解决方案至关重要。
这篇文章将探讨所提供的 Python 脚本中出现 428 状态代码的最可能原因以及修复该问题的可行策略,以确保与 API 的顺利交互和 200 状态代码响应。
命令 | 使用的编程命令说明 |
---|---|
如果匹配 | 此标头确保仅当资源与指定的 ETag 匹配时才处理请求。当服务器需要满足先决条件时,防止意外覆盖或更改至关重要。 |
如果-未修改-自 | 指定仅当资源自指定日期以来未更新时,请求才会成功。这是一种冲突预防措施,可确保在一定时间后不会进行任何修改。 |
requests.Session() | 一个 会议 对象支持跨多个请求的持久设置和 cookie。此方法通过保留请求之间的状态(例如标头和身份验证令牌)来优化重复请求。 |
会话.post() | 要创建或编辑资源,请使用 邮政 方法。在此示例中,它以 JSON 形式传输航班搜索条件,并从 API 请求航班数据。 |
json=有效负载 | 用于在请求正文中包含 JSON 对象。在脚本中,航班搜索数据被传输到 API 并进行处理。 |
session.headers.update() | 此方法向会话添加新标头,包括 用户代理 和 授权,以确保与服务器的正确连接并防止丢失标头或先决条件等问题。 |
推荐人 | 标头,用于标识用户在发出请求之前访问的最后一个 URL。出于安全原因或确定请求的来源,经常需要它。 |
状态码 | 该属性检查 HTTP 请求的响应代码。它用于确定请求是否成功(200)或遇到问题,例如 428 前置条件错误。 |
会话.get() | GET方法从服务器获取信息。它通常是交互中的第一个请求,用于在发送 POST 请求之前检索所需的 cookie 或令牌。 |
修复 Python 请求模块中的 HTTP 428 状态代码
该解决方案利用了Python的 要求 模块,通过提供缺少的前提条件(例如标头或授权)来集中解决 POST 请求中的 428 状态代码。
import requests
url = 'https://wizzair.com/en-gb'
link = 'https://be.wizzair.com/24.9.0/Api/search/search'
payload = {"isFlightChange": False, "flightList": [{"departureStation": "TIA", "arrivalStation": "VIE", "departureDate": "2024-09-17"}, {"departureStation": "VIE", "arrivalStation": "TIA", "departureDate": "2024-10-20"}], "adultCount": 1, "childCount": 0, "infantCount": 0, "wdc": True}
# Add If-Match or other required precondition headers
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Accept': 'application/json, text/plain, */*',
'Referer': 'https://wizzair.com/en-gb',
'If-Match': '<your-etag-here>',
'Content-Type': 'application/json'
}
with requests.Session() as session:
session.headers.update(headers)
r = session.get(url)
print(r.status_code)
response = session.post(link, json=payload)
print(response.status_code)
if response.status_code == 428:
print('428 Error: Missing required precondition.')
替代方法:为前提条件添加授权
此脚本提供授权令牌来规避 428 前提条件要求并确保对 API 的访问经过身份验证。
import requests
url = 'https://wizzair.com/en-gb'
link = 'https://be.wizzair.com/24.9.0/Api/search/search'
token = 'Bearer your_auth_token'
payload = {"isFlightChange": False, "flightList": [{"departureStation": "TIA", "arrivalStation": "VIE", "departureDate": "2024-09-17"}, {"departureStation": "VIE", "arrivalStation": "TIA", "departureDate": "2024-10-20"}], "adultCount": 1, "childCount": 0, "infantCount": 0, "wdc": True}
headers = {
'User-Agent': 'Mozilla/5.0',
'Authorization': token,
'Content-Type': 'application/json'
}
with requests.Session() as session:
session.headers.update(headers)
r = session.get(url)
print(r.status_code)
response = session.post(link, json=payload)
print(response.status_code)
if response.status_code == 428:
print('428 Error: Ensure valid authorization or conditions.')
处理标头中缺少的必填字段
此方法确保在 POST 请求中提供所有必需的标头,以避免由于缺少先决条件而导致的 428 错误,例如 如果-未修改-自 标头。
import requests
url = 'https://wizzair.com/en-gb'
link = 'https://be.wizzair.com/24.9.0/Api/search/search'
payload = {"isFlightChange": False, "flightList": [{"departureStation": "TIA", "arrivalStation": "VIE", "departureDate": "2024-09-17"}, {"departureStation": "VIE", "arrivalStation": "TIA", "departureDate": "2024-10-20"}], "adultCount": 1, "childCount": 0, "infantCount": 0, "wdc": True}
headers = {
'User-Agent': 'Mozilla/5.0',
'Accept': 'application/json, text/plain, */*',
'If-Unmodified-Since': 'Wed, 21 Oct 2020 07:28:00 GMT',
'Content-Type': 'application/json'
}
with requests.Session() as session:
session.headers.update(headers)
r = session.get(url)
print(r.status_code)
response = session.post(link, json=payload)
print(response.status_code)
if response.status_code == 428:
print('428 Error: Missing required headers.')
解决 HTTP 请求中的前提条件问题
当处理 HTTP 请求时, 428 状态码 通常表示服务器在继续之前需要特定的先决条件。省略保护标头,例如 如果匹配 或者 如果-未修改-自 可能会导致这个问题。这些标头有助于验证请求是否符合服务器的期望,从而降低覆盖数据或发送无效请求的可能性。
接收 428 状态代码的另一个重要问题可能是会话处理不当。许多在线应用程序依靠会话管理来验证用户身份并在连续请求中保留状态。例如,无法保留会话数据(例如 cookie 或令牌)可能会导致服务器拒绝下一个 POST 请求。使用Python的requests.Session() 能够正确处理这些会话,从而使与 API 的通信更加顺畅。
除了会话管理和先决条件之外,确保标头和有效负载的正确流动也至关重要。服务器经常需要安全标头,例如 授权, 推荐人, 和 起源。它们的缺失可能会导致请求失败,尤其是在访问受限或敏感数据时。确保在请求中提供并正确形成这些标头有助于避免 428 错误和其他困难。
关于 Python 中 HTTP 428 错误的常见问题
- 428状态码是什么意思?
- 428 状态代码表示服务器在处理请求之前需要特定标准,例如标头或令牌验证。
- 如何修复 Python 中的 428 错误?
- 使用像这样的标题 If-Match 或者 If-Unmodified-Since,并确保会话正确保存 requests.Session()。
- 为什么我的 POST 请求返回 428 错误?
- 在处理 POST 请求之前,服务器可能会检查条件,例如预先存在的标头或令牌。
- 的作用是什么 If-Match 标题?
- 这 If-Match header 确保仅当资源与指定的 ETag 值匹配时才处理请求。
- 如何确保 Python 请求中正确的会话处理?
- 使用 requests.Session() 使您的会话(包括标头和 cookie)在后续请求中保持一致。
关于修复 428 状态代码的最终想法
428 状态代码通常用于指示缺少先决条件,例如基本标头。要解决此问题,请确保请求包含正确的标头,例如 如果匹配 或者 如果-未修改-自。管理会话也很重要。
此外,通过适当管理身份验证和其他与安全相关的标头,您可以确保 POST 请求的处理不会出现问题。通过满足这些条件,服务器应返回所需的 200 状态代码,表明请求成功。
HTTP 428 状态代码解决方案的来源和参考
- 有关 HTTP 状态代码和排除先决条件错误的信息来自 Mozilla 开发者网络 。
- 官方 Python 请求文档提供了有关处理 HTTP 请求中的会话和标头的详细见解。访问 Python 请求库 。
- 为了了解会话处理和管理 API 令牌,资源来自 真正的Python 被引用。
- HTTP 错误处理的其他示例和故障排除步骤可以在 堆栈溢出 。