400 Bad Request
클라이언트의 요청이 유효하지 않아 더 이상 작업을 진행하지 않는 경우
API 서버는 클라이언트 요청이 들어오면 바로 작업을 진행하지 않고 요청이 서버가 정의한 유효성에 맞는지 확인 후 진행한다.
다음과 같은 사전 유효성 검증 작업을 진행할 수 있다.
대부분의 API는 사전에 유효성 검증을 통해 400
상태 코드로 클라이언트에게 유효하지 않은 요청임을 응답한다.
(유효성 검증 없이 진행하면 5xx
서버 오류가 발생할 수 있기 때문에 대부분 사전에 막는 로직을 추가한다.)
그러나, 400
상태 코드로 응답하는 것만으로는 부족하다.
오류 발생 시 파라미터의 위치(path
, query
, body
), 사용자 입력 값, 에러 이유를 꼭 명시하는 것이 좋다.
Bad
HTTP/1.1 400 Bad Request
Good case 1
HTTP/1.1 400 Bad Request
{
"message" : "'name'(body) must be String, input 'name': 123"
}
Good case 2
HTTP/1.1 400 Bad Request
{
"errors": [
{
"location": "body",
"param": "name",
"value": 123,
"error": "TypeError",
"msg": "must be String"
}
]
}
Good case 3
HTTP/1.1 400 Bad Request
{
"errors": {
"message": "'name'(body) must be String, input 'name': 123",
"detail": [
{
"location": "body",
"param": "name",
"value": 123,
"error": "TypeError",
"msg": "must be String"
}
]
}
}
잘 만들어진 API는 대부분 문서 정리도 잘되었기 때문에 문서만으로 파라미터의 어떤 값들이 유효하고 유효하지 않은지 쉽게 알 수 있다.
그러나, 대부분 API는 기능 위주로 만들어지기 때문에 문서에 많은 시간을 쓸 수 없다.
이러한 API를 사용하면서4XX
오류를 만나면 꽤 골치 아프다.
분명 클라이언트(요청자)의 잘못인데 어떤 부분이 잘못된 지 알려주지 않으니 유효한 요청을 하나씩 찾아야 한다.
400
상태 코드는 서버에서 잘못됐다고 판단하는 응답이기 때문에 서버는 그 요청이 왜 잘못된 지도 알 수 있다.
서버에선 쉽게 알 수 있지만 클라이언트는 알려주지 않으면 알기 어려운 내용인 것이다.커피숍을 예시로 들면,
고객(클라이언트
)이 바닐라라떼 더블샷(파라미터
)을 주문(요청
) 한다.
근데 이 커피숍에 바닐라라떼는 메뉴에 있지만, 샷 추가는 불가하다. 메뉴판(API 문서
)엔 이 내용이 없다.
이때, 카운터(API
)의 직원(URI
)이 고객에게해당 주문은 불가합니다
라고만 하면 고객은 어떤 반응일까?
바닐라라떼가 메뉴가 없나(404 상태 코드
)? 아니면 바닐라라떼는 주문이 많이 밀려서 불가한가(429 상태 코드
)? 등의 생각을 할 것이다.
카운터(API
)의 직원(URI
)은 고객에게바닐라라떼에 샷 추가는 불가합니다
라고 대답해야 한다.
출처: https://sanghaklee.tistory.com/61 [이상학의 개발블로그]