그날그날메모

Spring에서 지원되지 않는 요청 방법 (405)

Java

Spring에서 지원되지 않는 요청 방법 (405)

그날그날메모 2021. 4. 17. 18:18

1. 개요

이 빠른 기사는 개발자가 Spring MVC를 사용하여 특정 HTTP 동사에 대한 API를 노출하는 동안 직면하는 일반적인 오류 인 'Request Method not Supported – 405'에 초점을 맞추고 있습니다.

당연히이 오류의 일반적인 원인에 대해서도 설명합니다.

2. 요청 방법 기본 사항

일반적인 문제로 이동하기 전에 Spring MVC에 대해 배우기 시작했다면 여기에 좋은 소개 기사 가 있습니다.

또한 기본 사항을 매우 빠르게 살펴보고 Spring에서 지원하는 요청 메서드와 여기에서 관심있는 몇 가지 공통 클래스를 이해해 보겠습니다.

매우 단순화 된 방식으로 MVC HTTP 메서드는 요청이 서버에서 트리거 할 수있는 기본 작업입니다. 예를 들어, 일부 메소드  는 서버에서 데이터를 가져오고 , 일부 는 데이터를 서버에 제출 하고, 일부 는 데이터를 삭제할 수 있습니다 .

@RequestMapping 어노테이션은  요청에 대한 지원 방법을 지정합니다.

Spring은 enum RequestMethod 에서 지원되는 모든 요청 메소드를 선언합니다 . 표준  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE 동사를 지정합니다.

Spring DispatcherServlet은 제외하고 기본적으로 모두 지원  옵션TRACE@RequestMapping RequestMethod 열거 형사용하여 지원되는 메서드를 지정합니다.

3. 간단한 MVC 시나리오

이제 모든 HTTP 메서드를 매핑하는 코드 예제를 살펴 보겠습니다.

@RestController
@RequestMapping(value="/api")
public class RequestMethodController {

    @Autowired
    private EmployeeService service;

    @RequestMapping(value = "/employees", produces = "application/json")
    public List<Employee> findEmployees()
      throws InvalidRequestException {
        return service.getEmployeeList();
    }
}

예제에서 findEmployee ()  메서드 를 선언하는 방법을 확인하십시오  . 특정 요청 방법을 지정하지 않으므로이 URL은 모든 기본 방법을 지원합니다.

예를 들어 curl을 사용하여 지원되는 다른 방법을 사용하여 API를 요청할 수 있습니다.

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

당연히 간단한 curl 명령, Postman, AJAX 등을 통해 여러 방법으로 요청을 보낼 수 있습니다  .

물론 요청이 올바르게 매핑되고 성공 하면 200 OK 응답 을받을 것으로 예상합니다  .

4. 문제 시나리오 – HTTP 405

하지만 여기서 논의하는 것은 물론 요청이 성공하지 못할 때의 시나리오입니다.

' 405 Method Not Allowed '는 Spring 요청으로 작업하는 동안 관찰되는 가장 일반적인 오류 중 하나입니다.

다음과 같이 Spring MVC에서 GET 요청을 구체적으로 정의하고 처리하면 어떻게되는지 살펴 보겠습니다.

@RequestMapping(
  value = "/employees", 
  produces = "application/json", 
  method = RequestMethod.GET)
public List<Employee> findEmployees() {
    ...
}

// send the PUT request using CURL
$ curl --request PUT http://localhost:8080/api/employees
{"timestamp":1539720588712,"status":405,"error":"Method Not Allowed",
"exception":"org.springframework.web.HttpRequestMethodNotSupportedException",
"message":"Request method 'PUT' not supported","path":"/api/employees"}

5. 405 지원하지 않음 – 이유, 해결책

이 이전 시나리오에서 얻은 것은 405 상태 코드가 포함 된 HTTP 응답입니다. 이는 서버가 요청에서 보낸 메서드 / 동사를 지원하지 않음을 나타내는 클라이언트 오류입니다.

이름에서 알 수 있듯이이 오류의 원인은 지원되지 않는 메서드로 요청을 보내기 때문입니다.

예상 할 수 있듯이 기존 메서드 매핑에서 PUT에 대한 명시 적 매핑을 정의하여이 문제를 해결할 수 있습니다.

@RequestMapping(
  value = "/employees", 
  produces = "application/json", 
  method = {RequestMethod.GET, RequestMethod.PUT}) ...

또는 새 메서드 / 매핑을 별도로 정의 할 수 있습니다.

@RequestMapping(value = "/employees", 
  produces = "application/json", 
  method=RequestMethod.PUT)
public List<Employee> postEmployees() ...

6. 결론

요청 방법 / 동사는 HTTP 통신에서 중요한 측면이며, 서버 측에서 정의한 작업의 정확한 의미와 우리가 보내는 정확한 요청에주의해야합니다.

항상 그렇듯이이 기사에 표시된 예제 는 GitHub에서 사용할 수  있습니다 .

참고
  • https://docs.spring.io/spring-framework/docs/current/reference/html
  • https://www.baeldung.com/spring-request-method-not-supported-405