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 [이상학의 개발블로그]