Forespørselsmetode støttes ikke (405) om våren

1. Oversikt

Denne raske artikkelen er fokusert på en vanlig feil - 'Request Method not Supported - 405' - som utviklere møter mens de eksponerer API-ene sine for spesifikke HTTP-verb, med Spring MVC.

Naturligvis vil vi også diskutere de vanlige årsakene til denne feilen.

2. Grunnleggende om forespørselsmetode

Før du går mot det vanlige problemet, hvis du bare begynner å lære om Spring MVC, er det en god intro-artikkel til å begynne med.

La oss også se veldig raskt på det grunnleggende - og forstå forespørselsmetodene som støttes av Spring og noen av de vanlige klassene av interesse her.

På en svært forenklet måte er MVC HTTP-metoder grunnleggende operasjoner som en forespørsel kan utløse på serveren. For eksempel noen metoder hente dataene fra serveren, noen sende inn data til serveren, noen kanskje slett dataene etc.

De @RequestMapping-kommentar spesifiserer de støttede metodene for forespørselen.

Spring erklærer alle støttemetodene som støttes under en enum Forespørsel; den spesifiserer standarden FÅ, HODE, POST, PUT, PATCH, SLETT, ALTERNATIVER, SPOR verb.

Våren DispatcherServlet støtter dem alle som standard unntatt ALTERNATIVER og SPOR; @RequestMapping bruker RequestMethode enum for å spesifisere hvilke metoder som støttes.

3. Enkelt MVC-scenario

La oss nå se på et kodeeksempel som kartlegger alle HTTP-metoder:

@RestController @RequestMapping (value = "/ api") offentlig klasse RequestMethodController {@Autowired private EmployeeService service; @RequestMapping (verdi = "/ ansatte", produserer = "applikasjon / json") offentlig Liste findEmployees () kaster InvalidRequestException {return service.getEmployeeList (); }}

Legg merke til hvordan eksemplet erklærer finn medarbeider () metode. Den spesifiserer ikke noen spesifikk forespørselsmetode, noe som betyr at denne URL-en støtter alle standardmetoder.

Vi kan be om API ved hjelp av forskjellige støttede metoder, for eksempel ved hjelp av curl:

$ curl --request POST // localhost: 8080 / api / ansatte [{"id": 100, "name": "Steve Martin", "contactNumber": "333-777-999"}, {"id": 200, "name": "Adam Schawn", "contactNumber": "444-111-777"}]

Naturligvis kan vi sende forespørselen på flere måter - via en enkel krølle kommando, Postmann, AJAX, etc.

Og selvfølgelig forventer vi å få 200 OK svar, hvis forespørselen er riktig kartlagt og vellykket.

4. Problemscenario - HTTP 405

Men det vi diskuterer her er - selvfølgelig - scenariene når forespørselen ikke vil lykkes.

405 Metoden ikke tillattEr en av de vanligste feilene vi ser når vi arbeider med vårforespørsler.

La oss se på hva som skjer hvis vi spesifikt definerer og håndterer GET-forespørsler i Spring MVC, slik:

@RequestMapping (verdi = "/ ansatte", produserer = "applikasjon / json", metode = RequestMethod.GET) offentlig liste findEmployees () {...} // send PUT-forespørselen ved bruk av CURL $ curl --request PUT // localhost: 8080 / api / ansatte {"tidsstempel": 1539720588712, "status": 405, "error": "Metode ikke tillatt", "unntak": "org.springframework.web.HttpRequestMethodNotSupportedException", "melding": "Forespørsel metoden 'PUT' støttes ikke "," path ":" / api / ansatte "} 

5. 405 Ikke støtte - Årsak, løsning

Det vi får i dette forrige scenariet er HTTP-svaret med 405-statuskoden - en klientfeil som indikerer at serveren ikke støtter metoden / verbet som ble sendt i forespørselen.

Som navnet antyder her, er årsaken til denne feilen å sende forespørselen med en ikke-støttet metode.

Som du kan forvente, kan vi løse dette ved å definere en eksplisitt kartlegging for PUT, i den eksisterende metodekartleggingen:

@RequestMapping (verdi = "/ ansatte", produserer = "applikasjon / json", metode = {RequestMethod.GET, RequestMethod.PUT}) ...

Alternativt kan vi definere den nye metoden / kartleggingen separat:

@RequestMapping (verdi = "/ ansatte", produserer = "applikasjon / json", metode = RequestMethod.PUT) offentlig Listeinnlegg Ansatte () ... 

6. Konklusjon

Forespørselsmetoden / verbet er et kritisk aspekt i HTTP-kommunikasjon, og vi må være forsiktige med den eksakte semantikken til operasjonene vi definerer på serversiden, og deretter med de eksakte forespørslene vi sender inn.

Og som alltid er eksemplene vist i denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found