Förstå 428-statuskoden i Python HTTP-förfrågningar
När du använder Python förfrågningar modul, är det typiskt att stöta på HTTP-statuskoder som signalerar olika svårigheter med serversvar. Ett sådant fel är 428-statuskoden, som indikerar ett kriterium som servern måste uppfylla innan man fortsätter. Detta orsakas ofta av ett misslyckande med att tillhandahålla de nödvändiga rubrikerna eller att utföra förfrågningar i rätt ordning.
I det här scenariot försöker en användare skicka en POSTA begäran till en webbplats men får ett 428-svar istället för den avsedda 200-statuskoden. Skriptet innehåller korrekt konstruerade nyttolaster och rubriker, men en viktig komponent saknas, vilket gör att begäran misslyckas.
Sådana fel är vanliga vid interaktion med online-API:er, särskilt när servern kräver extra kriterier innan förfrågningar behandlas. Att förstå den underliggande orsaken till 428-statuskoden är avgörande för att åtgärda problemet och leverera framgångsrika lösningar.
Det här inlägget kommer att titta på de mest troliga orsakerna till 428-statuskoden i det medföljande Python-skriptet och genomförbara strategier för att fixa det, vilket säkerställer en smidig interaktion med API:et och ett 200-statuskodsvar.
Kommando | Beskrivning av de programmeringskommandon som används |
---|---|
Om-Match | Denna rubrik säkerställer att begäran endast hanteras om resursen matchar den angivna ETag. Det är avgörande när servern kräver att en förutsättning är uppfylld för att förhindra oavsiktliga överskrivningar eller ändringar. |
Om-Omodifierad-Sedan | Anger att begäran endast kommer att lyckas om resursen inte har uppdaterats sedan det angivna datumet. Detta är en konfliktförebyggande åtgärd som säkerställer att inga ändringar görs efter en viss tid. |
requests.Session() | A Sessionen objekt möjliggör beständiga inställningar och cookies över flera förfrågningar. Detta tillvägagångssätt optimerar upprepade förfrågningar genom att bevara tillstånd, såsom rubriker och autentiseringstokens, mellan dem. |
session.post() | För att skapa eller redigera en resurs, använd POSTA metod. I det här exemplet överför den flygsökningskriterierna som JSON och begär flygdata från API:et. |
json=nyttolast | Används för att inkludera ett JSON-objekt i brödtexten i en begäran. I skriptet överförs flygsökningsdatan till API:t och bearbetas. |
session.headers.update() | Detta tillvägagångssätt lägger till nya rubriker till sessionen, inklusive Användaragent och Tillstånd, för att säkerställa korrekt anslutning till servern och förhindra problem som saknade rubriker eller förutsättningar. |
Referent | En rubrik som identifierar den senaste webbadressen som användaren besökte innan för att göra begäran. Det krävs ofta av säkerhetsskäl eller för att fastställa ursprunget till begäran. |
status_kod | Det här attributet kontrollerar HTTP-förfrågans svarskod. Den används för att avgöra om begäran lyckades (200) eller mötte ett problem, såsom 428 förutsättningsfelet. |
session.get() | GET-metoden hämtar information från servern. Det är ofta den första begäran i en interaktion, som används för att hämta nödvändiga cookies eller tokens innan en POST-förfrågan skickas. |
Fixar HTTP 428-statuskoden i Pythons begärandemodul
Denna lösning utnyttjar Pythons förfrågningar modul, koncentrerad på att lösa 428-statuskoden i POST-förfrågningar genom att tillhandahålla saknade förutsättningar såsom rubriker eller auktorisering.
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.')
Alternativ tillvägagångssätt: Lägga till auktorisation för förutsättning
Detta skript tillhandahåller en auktoriseringstoken för att kringgå 428 förutsättningskravet och säkerställa autentiserad åtkomst till API:et.
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.')
Hantera saknade obligatoriska fält i rubriker
Den här metoden säkerställer att alla nödvändiga rubriker tillhandahålls i POST-begäran för att undvika 428-felet på grund av saknade förutsättningar, t.ex. Om-Omodifierad-Sedan rubrik.
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.')
Lösa förutsättningsproblem i HTTP-förfrågningar
När du bearbetar HTTP-förfrågningar, a 428 statuskod indikerar vanligtvis att servern kräver särskilda förutsättningar innan du fortsätter. Utelämna skyddsrubriker som Om-Match eller Om-Omodifierad-Sedan kan leda till detta problem. Dessa rubriker hjälper till att verifiera att begäran matchar serverns förväntningar, vilket minskar sannolikheten för att skriva över data eller skicka ogiltiga förfrågningar.
En annan viktig fråga när det gäller att ta emot en 428-statuskod kan vara dålig sessionshantering. Många onlineapplikationer förlitar sig på sessionshantering för att autentisera användare och behålla status över successiva förfrågningar. Om till exempel misslyckas med att bevara sessionsdata, såsom cookies eller tokens, kan det leda till att servern avvisar nästa POST-begäran. Använder Pythons requests.Session() möjliggör korrekt hantering av dessa sessioner, vilket resulterar i smidigare kommunikation med API.
Utöver sessionshantering och förutsättningar är det viktigt att säkerställa korrekt flöde av rubriker och nyttolaster. Servrar kräver ofta säkerhetshuvuden som t.ex Tillstånd, Referent, och Ursprung. Deras frånvaro kan göra att begäran misslyckas, särskilt när man får åtkomst till begränsad eller känslig data. Att se till att dessa rubriker tillhandahålls och utformas på rätt sätt i begäran kan hjälpa till att undvika 428-felet och andra svårigheter.
Vanliga frågor om HTTP 428-fel i Python
- Vad betyder 428-statuskoden?
- Statuskoden 428 indikerar att servern kräver specifika kriterier, såsom rubriker eller tokenvalidering, innan begäran behandlas.
- Hur fixar jag 428-felet i Python?
- Använd rubriker som If-Match eller If-Unmodified-Since, och se till att sessionen är korrekt bevarad med requests.Session().
- Varför returnerar min POST-begäran ett 428-fel?
- Innan POST-begäran behandlas kommer servern sannolikt att leta efter ett tillstånd, till exempel en redan existerande rubrik eller token.
- Vad är rollen för If-Match rubrik?
- De If-Match header säkerställer att begäran endast hanteras om resursen matchar det angivna ETag-värdet.
- Hur kan jag säkerställa korrekt sessionshantering i Python-förfrågningar?
- Använder requests.Session() håller din session, inklusive rubriker och cookies, konsekvent över efterföljande förfrågningar.
Sista tankar om att fixa 428-statuskoden
428-statuskoden används ofta för att indikera saknade förutsättningar, såsom viktiga rubriker. För att lösa det här problemet, se till att begäran innehåller rätt rubriker, t.ex Om-Match eller Om-Omodifierad-Sedan. Att hantera sessioner är också viktigt.
Genom att hantera autentisering och andra säkerhetsrelaterade rubriker på rätt sätt kan du dessutom säkerställa att POST-begäran hanteras utan problem. Genom att adressera dessa kriterier bör servern returnera den erforderliga 200-statuskoden, vilket indikerar att begäran lyckades.
Källor och referenser för HTTP 428 Status Code Solutions
- Information om HTTP-statuskoder och felsökning av förutsättningsfel erhölls från Mozillas utvecklarnätverk .
- Den officiella Python Requests-dokumentationen gav detaljerade insikter om hantering av sessioner och rubriker i HTTP-förfrågningar. Besök Python Requests Library .
- För att förstå sessionshantering och hantering av API-tokens, resurser från Riktig Python refererades.
- Ytterligare exempel och felsökningssteg för HTTP-felhantering finns på Stack Overflow .