HTTP 헤더 또는 응답 본문에 나머지 오류 메시지가 있습니까?


82

iPhone 및 Android 클라이언트에 노출되는 REST 서비스가 있습니다. 현재 HTTP 코드 200, 400, 401, 403, 404, 409, 500 등을 따릅니다.

내 질문은 오류의 원인 / 설명 / 원인을 입력하는 권장 장소는 어디입니까? REST API가 항상 헤더에 사용자 정의 Reason을 갖는 것이 더 합리적입니까?

< HTTP/1.1 400 Bad Request - Missing Required Parameters.
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked

아니면 JSON을 통해 응답 본문에 포함하는 것이 더 낫습니까?

< HTTP/1.1 400 Bad Request
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json
{ "error" : "Missing Required Parameters" }

6
요즘에는 'X-HTTP-Error-Description : Missing required parameters'와 같은 커스텀 헤더를 추가하는 것이 일반적인 관행입니다.
andreszs

답변:


94

400.x 오류 코드에 대한 HTTP 사양에서 인용 :

4xx 클래스의 상태 코드는 클라이언트가 오류가있는 것으로 보이는 경우를위한 것입니다. HEAD 요청에 응답 할 때를 제외하고, 서버는 오류 상황에 대한 설명과 그것이 일시적 또는 영구적 조건인지 여부를 포함하는 엔티티를 포함해야합니다 (SHOULD). 이러한 상태 코드는 모든 요청 방법에 적용 할 수 있습니다. 사용자 에이전트는 포함 된 모든 엔티티를 사용자에게 표시해야합니다.

오류 메시지를 HTTP 응답 본문에 엔티티로 포함하는 것이 가장 좋습니다 (JSON, 일반 텍스트, 형식화 된 HTML 또는 활용할 수있는 기타 형식).


24

본문에 오류 세부 정보가있는 것이 좋습니다. 또한 많은 (대부분 / 거의 모든, 예 : WSGI) 서버 및 클라이언트는 오류 코드의 이름 변경을 지원하지 않습니다. 고정 된 쌍으로 취급합니다 (예 : 400은 항상 "잘못된 요청"이 아니라 "잘못된 요청-사용자 사용자 ID를 지정하는 것을 잊었습니다 "). 고장 나지 않더라도 특정 오류 코드에 대한 특별한 이름은 신경 쓰지 않습니다.


3

오류는 본문에 속하지 않습니다. 경고 헤더에 속합니다.

경고 일반 HTTP 헤더에는 메시지 상태의 가능한 문제에 대한 정보가 포함되어 있습니다.

참고


3
이를 위해 "공식적인"헤더를 사용하는 것이 좋을 것입니다. 그러나 Warning이름에서 알 수 있듯이은 오류가 아닙니다. RFC (7234)는 다음과 같이 말합니다.> 오류 상태 코드가 아닌 경고를 사용하면 이러한 응답이 실제 실패와 구별됩니다.
Frans

1
참고 : Warning 헤더는 곧 지원 중단 될 예정입니다. 자세한 내용은 Warning ( github.com/httpwg/http-core/issues/139 ) 및 Warning : header & stale-while-revalidate ( github.com/whatwg/fetch/issues/913 )를 참조하세요.
Bizmarck

-5

나는 항상 둘 다합니다. 나는 보통 "409-새 사용자를 추가 할 수 없습니다. 이미 존재합니다."와 같이 프런트 엔드가 사용자에게 친숙한 방식으로 표시 할 수있는 상태 메시지를 설정합니다.

그런 다음 UI 개발자가 수행 할 작업에 대해 지능적인 선택을 시도 할 수 있도록 본문에 오류 조건의 세부 정보를 JSON으로 포함합니다.

{
  "status": 409,
  "message": "The user <username> was already added on <when> by <who> and given the user id 12345.",
  "errors": {
    "id": 12345
  }
}

10
HTTP 상태 코드를 응답 본문에 넣는 것을 전에 본 적이 있지만 왜 누군가가 이것이 좋다고 생각하는지 이해할 수 없습니다. 이 오류를 수신하는 모든 클라이언트는 이미이 코드가 포함 된 응답 헤더를 사용할 수 있어야하므로 본문에 추가하는 것은 불필요하며 정보가 일치하지 않을 가능성이 있습니다. 왜?
TheHerk

많은 사용 사례가 있지만 기본적으로 애플리케이션의 다른 부분에서 처리되는 두 코드를 생각합니다. 헤더의 http 상태 코드는 통신 계층에 의해 포착되고 잠재적으로 처리됩니다. 애플리케이션 수준에서 409 또는 422는 사용자를 올바른 작업 과정으로 라우팅하기 위해 다르게 처리 될 수 있습니다. (층은 예를 들어, SPA에 레이어를 설명하기 위해 대략 여기에 사용)
매튜 퍼든
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.