HTTP 405 Method Not Allowed: wat het betekent en hoe u het oplost
HTTP 405 Method Not Allowed
HTTP 405 Method Not Allowed: oorzaken, Allow-header, oplossingen | We.Inc
Waarom een server 405 antwoordt, welke Allow-header hij moet sturen en hoe u het oplost in Flask, Express en Next.js. Bouw de juiste 405-response voor uw eigen route.
Een 405 Method Not Allowed betekent dat de URL bestaat maar de HTTP-methode die u gebruikte niet accepteert, bijvoorbeeld een POST naar een route die alleen GET afhandelt. De server moet de methoden die hij wel accepteert opsommen in een Allow-header. Stuur een van die methoden, of voeg op de server een handler voor uw methode toe.
405 vergeleken met verwante statuscodes
Status
Betekenis
Gebruikelijke oplossing
405 Method Not Allowed
De resource bestaat; deze methode wordt ervoor niet geaccepteerd
Gebruik een methode uit Allow, of voeg een handler toe
404 Not Found
Geen resource op deze URL
Corrigeer het pad
501 Not Implemented
De server ondersteunt de methode helemaal niet
Gebruik een standaardmethode
403 Forbidden
De methode is prima, u mist toestemming
Vraag toegang of wissel van account
Vink de methoden aan die uw route afhandelt, kies de methode die een client stuurt, en de bouwer toont de exacte response die de server moet teruggeven: een normaal succes, of een 405 met een Allow-header die de methoden noemt in de volgorde waarin u ze hebt aangevinkt.
Vink elke methode aan die uw route echt afhandelt.
Kies de methode die het mislukte verzoek gebruikt. Het Network-paneel van uw browser toont die.
Lees de response. Een 405 moet Allow bevatten met elke methode die u hebt aangevinkt.
Kopieer hieronder de oplossing die bij uw framework past.
Controleer eerst de Allow-header in de mislukte response. Die vertelt welke methoden de server aanneemt, en dat onthult vaak een formulier dat de verkeerde gebruikt.
Een formulier zonder method-attribuut verstuurt met GET. Als uw handler alleen POST aanneemt, voeg dan method="post" toe aan het formulier.
Een afsluitende slash of een redirect kan onderweg van een POST een GET maken, die dan op een route belandt die alleen POST accepteert. Bekijk elke stap in het Network-paneel.
Als u de server schrijft, geef dan voor een bekend pad met de verkeerde methode 405 met Allow terug in plaats van 404. Clients en API-tools kunnen de fout dan uitleggen.
Veelgestelde vragen
Is 405 een probleem van de client of van de server?
Het is een 4xx-code, dus de server heeft bezwaar tegen het verzoek. Ofwel moet de client een andere methode gebruiken, ofwel moet de eigenaar van de server ondersteuning toevoegen voor de methode die wordt gestuurd.
Moet een 405-response de Allow-header bevatten?
Ja. RFC 9110 zegt dat de server een Allow-headerveld moet genereren met de methoden die de resource op dat moment ondersteunt. Een lege lijst mag als de resource helemaal geen methoden aanneemt.
Waarom krijg ik 405 als ik een formulier verstuur?
Meestal stuurt het formulier een methode die de route niet accepteert. Een route in Flask antwoordt bijvoorbeeld alleen op GET tot u methods=["GET", "POST"] aan de route-decorator meegeeft.
Waarom geeft Express mij 404 in plaats van 405?
Express behandelt een niet-passende methode en een niet-passend pad op dezelfde manier: geen route heeft gereageerd, dus het verzoek valt door naar de 404-handler. Voeg met app.all een vangnet voor het pad toe om zelf 405 te sturen.
Wat is het verschil tussen 405 en 501?
405 betekent dat deze resource een methode weigert die de server wel begrijpt. 501 betekent dat de server de methode voor geen enkele resource ondersteunt.
De regel in de specificatie
De methode wordt door de origin-server herkend, maar de doelresource ondersteunt haar niet. Omdat de server weet welke methoden wel zouden werken, verplicht de specificatie hem dat via Allow te melden. Een 405 zonder Allow is onvolledig.
Waar een 405 meestal vandaan komt
Frameworkroutes die voor één methode zijn geregistreerd, API-gateways die elke methode apart koppelen, en statische bestandsservers die bestanden serveren maar geen schrijfacties accepteren, zijn de gebruikelijke bronnen. In elk geval paste het pad wel en de methode niet.
Route handlers in Next.js exporteren één functie per methode. De ondersteunde namen zijn GET, POST, PUT, PATCH, DELETE, HEAD en OPTIONS, en als u OPTIONS niet exporteert, beantwoordt Next.js die voor u met een Allow-header op basis van de methoden die u wel hebt geëxporteerd.
Oplossingen per stack
Flask: declareer elke methode die de route aanneemt
Zonder methods= antwoordt de route alleen op GET (Flask voegt HEAD en OPTIONS automatisch toe).
Express: stuur een echte 405 in plaats van door te vallen naar 404
app.all na de echte handlers vangt elke andere methode voor hetzelfde pad op.
Route handler in Next.js: exporteer de methode die u aanroept
app/api/items/route.ts. Een verzoek met een methode die u niet hebt geëxporteerd, kan uw code niet bereiken.
HTML: geef het formulier de methode die de server verwacht
Een formulier zonder method-attribuut verstuurt als GET.
405-responsebouwer
Methoden die deze route afhandelt
Methode die de client stuurt
Wat de server moet terugsturen
De methode wordt ondersteund, dus er komt geen 405 aan te pas.
De methode staat niet in de lijst, dus het antwoord is 405 met een Allow-header die de {n} methoden noemt die u hebt aangevinkt.