API에서 HTTP 상태 코드 404를 사용하는 경우


58

나는 프로젝트를 진행 중이며 약 1 시간 이상 직장에서 사람들과 논쟁을 벌이고 있습니다. 나는 스택 교환 사람들이 무엇을 말할지 알기로 결정했습니다.

우리는 시스템에 대한 API를 작성 중입니다. 조직 트리 또는 목표 트리를 반환 해야하는 쿼리가 있습니다.

조직 트리는 사용자가있는 조직입니다. 즉,이 트리는 항상 존재해야합니다. 조직에는 항상 목표 트리가 있어야합니다. (논쟁이 시작된 곳). 트리가 존재하지 않는 경우 동료는 상태 코드 200으로 응답에 응답하는 것이 옳은 것으로 결정했습니다. 그런 다음 트리가 없을 때 응용 프로그램이 분리되어 코드가 수정되도록 요청했습니다.

나는 화염과 분노를 아끼려 고 노력할 것이다.

나무가 없을 때 404 오류를 발생시키는 것이 좋습니다. 적어도 뭔가 잘못되었다는 것을 알려주는 것입니다. 200을 사용할 때 오류를 처리하려면 성공 콜백에서 응답에 특별한 검사를 추가해야합니다. 객체를받을 것으로 예상되지만 아무것도 발견되지 않아 실제로 빈 응답을받을 수 있습니다. 응답을 404로 표시하는 것은 완전히 공평한 것 같습니다. 그리고 전쟁이 시작되고 HTTP 상태 코드 스키마를 이해하지 못했다는 메시지가 나타납니다. 그래서 나는 여기에 있으며이 경우 404의 문제점을 묻고 있습니까? 나는 " 아무것도 찾지 못해 200을 돌려주는 것이 옳다 "라는 주장을 얻었다 . 나는 나무가 항상 있어야하기 때문에 그것이 잘못되었다고 생각합니다. 우리가 아무것도 발견하지 않고 무언가를 기대하고 있다면 404가되어야합니다.

더 많은 정보,

가져온 URL을 추가하는 것을 잊었습니다.

조직

/OrgTree/Get

목표

/GoalTree/GetByDate?versionDate=...
/GoalTree/GetById?versionId=...

내 실수는 두 매개 변수가 모두 필요합니다. 날짜로 구문 분석 할 수있는 버전 날짜가 제공되면 마감 수정본을 반환합니다. 과거에 무언가를 입력하면 첫 번째 개정판이 반환됩니다. 존재하지 않는 ID를 가진 ID에 의해 200으로 빈 응답을 반환 할 것으로 의심됩니다.

특별한

또한 문제에 대한 가장 좋은 대답은 조직을 만들 때 기본 개체를 만드는 것입니다. 트리가 유효하지 않아야하며 정의되지 않은 동작으로 간주되어야합니다. 두 트리없이 계정을 사용할 수있는 방법은 없습니다. 따라서 항상 존재해야합니다.

또한 이것을 연결했습니다 (하나는 비슷하지만 찾을 수 없습니다)

http://viswaug.files.wordpress.com/2008/11/http-headers-status1.png


전제 조건에 따라 항상 나무 있는 경우 트리가 없을 때 응용 프로그램이 어떻게 분리 될 수 있습니까? (나는 당신에게 동의합니다 그것은 404처럼 보입니다)
Andres F.

코드는 null을 확인하지 않았으며 json 문자열과 객체를 구문 분석했습니다. 코드의 특정 위치에서 "is"로드 된 개체는 내부에서 찾을 수 없기 때문에 존재하지 않습니다.
Loïc Faure-Lacroix

4
액세스하려는 리소스에 URI를 제공하면 더 명확 해집니다. / goals /이면 200과 빈 세트를 반환합니다. / goals / {goal_id}에 액세스하려고하면 404를 반환합니다. / goals /에 대한 요청에 대해 404를 반환하면 URI가 존재하지 않으며 더 이상 사용되어서는 안됩니다.
imel96

1
여전히 두 경우 모두 문제가 있습니다. 무엇을 /GoalTree/GetById?versionId=CompletelyInvalidID반환 해야 합니까? 이름 /GoalTree/GetById?versionId=CompletelyInvalidID이 지정된 리소스를 찾을 수 없으므로 성공하지 못했습니다 .

2
대단한 토론이 귀하의 작업에서 인터넷으로 옮겨졌습니다! 지금 막을 수 없습니다!
Carlos Campderrós

답변:


79

때 의심, 설명서를 참조하십시오 . HTTP 상태 코드에 대한 W3C 정의를 검토하면 다음과 같이됩니다.

200 OK-요청이 성공했습니다. 응답과 함께 리턴되는 정보는 요청에 사용 된 방법에 따라 다릅니다.

404 Not Found-서버가 Request-URI와 일치하는 것을 찾지 못했습니다.

API와 관련하여 쿼리 생성 방법과 객체 검색 방법에 따라 크게 달라집니다. 그러나 내 해석은 항상 다음과 같습니다.

  • 특정 객체를 요청하고 반환 200코드가 있으면 존재하지 않으면 올바른 404코드를 반환하십시오 .
  • 그러나 쿼리와 일치하는 개체 집합을 요청하면 null 집합이 유효한 응답이며 200코드 와 함께 반환되기를 원합니다 . 이에 대한 근거는 쿼리가 유효하고 성공했으며 쿼리가 아무것도 반환하지 않았다는 것입니다.

따라서이 경우 서비스가 정확 하고 서비스가 특정 항목을 요청 하는 "특정 항목"을 검색 하지 않습니다. 해당 항목을 찾지 못하면 명확하게 말하십시오.

Wikipedia가 가장 잘 생각합니다.

200 OK-... 실제 응답은 사용 된 요청 방법에 따라 다릅니다. GET 요청에서 응답에는 요청 된 자원에 해당하는 엔티티가 포함됩니다.

404 찾을 수 없음-요청한 리소스를 찾을 수 없지만 나중에 다시 사용할 수 있습니다. 클라이언트의 후속 요청은 허용됩니다.

나에게 꽤 분명한 것 같습니다.

예제 요청에 대해

/GoalTree/GetByDate?versionDate=...
/GoalTree/GetById?versionId=...

형식의 경우 항상 가장 가까운 개정을 해당 날짜로 되돌립니다. 결코 객체를 반환하지 않으므로 항상 반환해야합니다 200 OK. 이것이 날짜 범위를 취할 수 있고 논리가 해당 시간 범위 내에서 모든 객체를 반환하는 경우에도 200 OK-0 결과는 괜찮습니다. 요청이 그 기준에 부합하는 것입니다.

그러나 후자는 그 정체성 으로 특정 객체를 요구할 때 다릅니다 . 200 OK요청 된 리소스가 없고 찾을 수 없으므로이 경우 반환 이 잘못 되었습니다 .

상태 코드 선택에 관하여

  • 2xx 코드 UA 에 요청 이 올바르게 수행 되었다고 알립니다 . 앞으로도 계속 그렇게 할 수 있습니다.
  • 3xx 코드 UA에게 귀하가 요청한 내용이 작동하는 데 도움이되었지만 현재는 다른 곳에 있다고 말합니다. 향후 UA 는 리디렉션으로 이동하는 것을 고려할 수 있습니다 .
  • 4xx 코드 UA에게 무언가 잘못했다고 알려주십시오. 구성된 요청은 적절하지 않으며 최소한 수정하지 않고 다시 시도해서는 안됩니다.
  • 5xx 코드 UA에게 서버가 어떻게 고장 났는지 알려 줍니다. 그러나이 쿼리는 나중에 작동 할 수 있으므로 다시 시도하지 않을 이유가 없습니다. (400 문제 이상인 501 제외).

5xx 코드를 사용하여 주석에 언급했지만 시스템이 작동 중입니다. 작동하지 않는 쿼리를 요청하여 UA에 전달해야합니다. 아무리 슬라이스해도 4xx 지역입니다.

우리 태양계에 문의하는 외계인을 생각해보십시오.

외국인 : 컴퓨터, 인간이 살고있는 모든 행성을 말해주세요.

컴퓨터 : 1 개의 결과를 찾았습니다. 지구

외국인 : 컴퓨터, 지구 에 대해 알려주십시오 .

컴퓨터 : 지구-대부분 무해합니다.

외계인 : 컴퓨터, 소행성 벨트 바깥에 사는 모든 행성에 대해 알려주십시오.

컴퓨터 : 0 개의 결과를 찾았습니다.

외국인 : 컴퓨터, 지구를 파괴하십시오.

컴퓨터 : 200 OK.

외국인 : 컴퓨터, 지구 에 대해 알려주십시오 .

컴퓨터 : 404-찾을 수 없음

외국인 : 컴퓨터, 인간이 살고있는 모든 행성을 말해주세요.

컴퓨터 : 0 개의 결과를 찾았습니다.

외국인 : 강력한 Irken Empire의 승리!


4
+1 결과를 반환하지 않는 쿼리가 아닙니다. 브라우저에 알려진 웹 페이지를 요청하고 찾지 않는 것과 같습니다. 정확히 404가 무엇인지.
Andres F.

2
@ imel96 당신은 쿼리 문자열이 URL의 일부라는 것을 잊어 버렸습니다.
Loïc Faure-Lacroix

1
@LegoStormtroopr 지구가 존재하지 않을 때 유니버스가 유효하지 않기 때문에 재미있는 "외계인"예제가 작동합니다. 그러나 OP의 설명에 따라 그의 시스템 에는 나무 포함 되어야합니다 . 트리가 없으면 시스템이 작동하지 않습니다.
Andres F.

1
@LegoStormtroopr 데이터베이스 테이블을 상상해보십시오. 테이블을 쿼리하고 때로는 결과를 얻지 만 때로는 그렇지 않습니다. 테이블은 리소스이며 행을 반환하는지 여부에 관계없이 항상 존재합니다. 테이블은 식별 가능하며 이름은 http 리소스에 URI가있는 것과 같습니다. 행은 아니고 일부 매개 변수와 만 일치합니다. 데이터베이스에서도 아무 것도 일치하지 않는 업데이트를 수행하면 "OK 0 rows 영향"이 표시됩니다.
imel96

2
@ LegoStormtroopr 이미 답변이 있습니다. / GoalTree / GetById? versionId = x를 다시 매핑하려면 Location 헤더가 / GoalTree / Id / x로 설정된 301을 반환해야합니다.
imel96

11

/ GoalTree / Get *가 리소스가 아닌 동사처럼 보인다는 사실을 무시하면 URI / GoalTree / Get *는 항상 액세스 할 수있는 리소스를 나타내므로 트리가 없으면 클라이언트 오류가 아니므로 항상 200을 반환해야합니다. 요청. 반환 할 엔터티가 없으면 빈 세트로 200을 반환하십시오.

엔터티가 없을 때가 아니라 리소스를 찾을 수 없으면 404를 사용합니다.

객체에 대해 404를 반환하려면 다른 방식으로 입력 한 다음 고유 한 URI를 지정하십시오.


1
흠. 이것은 말이됩니다. 404는 사용자 오류이지만 OP가 설명 하듯이 실제로는 시스템 오류입니다. 사용자의 요청은 완벽하게 유효합니다! "트리 없음"이 오류 이기 때문에 200이 올바른 응답이라는 데 동의하지 않습니다 .
Andres F.

@ imel96 빈 / 상태 코드 4xx / 5xx 대신 항상 유효한 엔티티가 반환되도록하고 싶습니다. 그것이 단지 저라면, 예를 들어 위키처럼 유효한 엔티티를 반환합니다. 적은 두통으로 오류를 처리 할 필요가 없습니다. 그대로 500과 거의 비슷하다고 말하고 싶습니다. 시스템이 정의되지 않은 상태에 있기 때문에 발생하지 않아야합니다. 그리고 OK를 반환하는 것은 의미가 없습니다. rfc에 관한 404도 이해가되지 않습니다. 따라서 아무 의미가 없을 때 ... 500 만 의미가 있습니다!
Loïc Faure-Lacroix 1

@Sybiam 잘, 당신은 매우 잘 정의 된 http 상태 코드를 요청했습니다. 이와 관련하여 비즈니스 로직에 오류가 있다고하더라도 http 서버로서 시스템에 오류가있는 것은 아닙니다. 귀하의 경우 요청을 이해하고 쿼리를 처리했으며 결과가 엔티티가 아닌 경우가 발생했습니다. 따라서 500도 사용할 수 없습니다. 최소한 객체에 적절한 URI를 제공하고 rfc가 더 ​​의미가 있는지 확인하십시오.
imel96

+1 REST API (각 엔티티에 고유 한 경로가 있음)가있는 경우 404를 리턴 할 수 있지만 경로는 동사이며 항상 발견됩니다.
OrangeDog

@OrangeDog는 : /GoalTree/GetById?versionId=12345 특정 자원, 버전 ID에 대응하는 데이터, 즉 식별 완벽하게 좋은 URI (물론, 상대 하나 이상) 12345시스템에있다. 그러한 ID를 가진 데이터가 없으면 404 HTTP 응답이 완벽하게 적합합니다. 물론 응답 본문에는 오류의 구체적인 특성과 원인을 나타내는 적절한 형식의 응답 (예 : 해당 리소스를 요청하는 일반 클라이언트가 예상하는 경우 JSON)이 포함되어야합니다.
Ilmari Karonen

7

이것은 시스템 사양에 관한 것이기 때문에 흥미로운 질문입니다.

4xx 코드 계열은 주로 사용자 / 클라이언트 오류에 대한 것이기 때문에 imel96의 응답 은 404가 올바른 응답이 아니라고 확신했습니다 . URL은 올바른 형식이며 트리가 있어야합니다. 그렇지 않으면 시스템이 일관성이없는 상태입니다!

따라서 이것은 서버 오류, 즉 5xx 제품군의 문제입니다. 일반 500 내부 서버 오류 또는 503 서비스를 사용할 수 없음 ( "서비스가 있어야 할 트리를 가져 오십시오").


2
사실이 아닙니다. 사용자가 존재하지 않는 것을 요청했기 때문에 오류가 발생했습니다 .

@LegoStormtroopr 존재하지 않는 것을 요청하는 것이 항상 오류는 아닙니다. 네트워크 리소스를 요청하고 네트워크가 다운 된 경우 네트워크 오류입니다.
Andres F.

1
@LegoStormtroopr 게다가 나무 존재 해야 합니다. OP의 설명에 따라 시스템이 없으면 시스템이 작동하지 않습니다. 따라서이 리소스를 요청하는 것이 유효합니다. 없는 경우 시스템 (또는 서버) 오류 여야합니다 .
Andres F.

2
@Sybiam 5xx 코드의 경로로 이동하려는 경우 503은 "503 서비스를 사용할 수 없음-서버가 일시적으로 오버로드되거나 서버를 유지 관리하여 서버가 현재 요청을 처리 할 수 ​​없습니다." 서버가 과부하되지 않아 요청을 찾지 못했습니다. 또한 5xx 코드는 "서버가 서버에 오류가 있거나 요청을 수행 할 수 없음을 인식 한 경우"를위한 코드입니다.

1
@AndresF. 솔직히 말하면 500 코드가 좋습니다. 시간이 지남에 따라 질문이 어떻게 변했는지를 감안하면 효과가 있습니다. 대부분 모든 것이 정상이 아닌 경우 200을 반환하는 것에 대해 집회하고 있습니다.

6

상황을 어떻게 보느냐에 따라 200 또는 404 응답 코드가 유효 할 수 있다고 말하고 싶습니다 .

문제는이다 HTTP 응답 코드가 의 맥락에서 정의 된 서버 의 다양한 제공 할 수 있습니다, 자원 자신의 URL을 기반으로합니다. 이러한 맥락에서 의미는 명확 200 OK하고 404 Not Found모호하지 않습니다. 전자는 "여기에 요청한 자원이 있습니다"라고 말하고 후자는 "죄송합니다. 그런 자원이 없습니다"라고 말합니다.

그러나 상황에 따라 HTTP 서버와 요청중인 실제 리소스 (트리) 사이에 추가 응용 프로그램 계층이 있습니다. 응용 프로그램은 HTTP 사양에서 잘 다루지 않는 일종의 중간 공간을 차지합니다.

웹 서버의 관점에서 볼 때 응용 프로그램은 일종의 리소스처럼 보입니다 . 일반적으로 서버가 제공 할 수있는 다른 리소스 (예 : 정적 파일)와 마찬가지로 URL의 일부로 URL에 의해 식별되는 서버의 파일입니다. 다른 한편으로, 그것은 내용의 내용을 동적으로 결정하는 실행 가능한 코드와 잠재적으로 상태 코드까지도 응답하는 미니 코드와 같은 방식으로 작동하기 때문에 이상한 종류의 리소스입니다.

특히 예제의 경우 웹 서버는 응용 프로그램을 올바르게 찾을 수 있지만 응용 프로그램은 요청 된 하위 리소스 (트리)를 찾지 못합니다. 이제 애플리케이션을 서버의 확장으로 간주하고 하위 항목 (트리)을 실제 자원으로 간주하면 404 응답 이 적절합니다. 서버는 단지 실제 자원을 찾는 태스크를 애플리케이션에 위임 한 것입니다. 그 차례에 실패했습니다.

반면에, 당신의 관점이 응용 프로그램이 요청 되는 자원 이라면 웹 서버는 200 응답을 반환해야합니다 . 결국, 응용 프로그램을 찾아 올바르게 실행했습니다. 분명히이 경우 응용 프로그램은 실제로 예상되는 형식으로 유효한 응답 본문을 반환하여 쿼리와 일치하는 실제 데이터가 발견되지 않았 음을 나타냅니다 (포맷하는 상위 수준 프로토콜 사용).

이 두 가지 관점 모두 이해할 수 있습니다. 대부분의 경우 최소한 일반 웹 브라우저를 사용하여 HTTP를 통해 직접 액세스하려는 응용 프로그램의 경우 이전의 견해를 선호합니다 . 사용자는 일반적으로 서버와 응용 프로그램의 차이점과 같은 내부 세부 정보를 신경 쓰지 않습니다. 원하는 데이터가 있는지 여부에 대해주의하십시오.

그러나 HTTP를 저수준 전송 계층으로 만 사용하여 사용자 지정 고급 API 프로토콜을 사용 하여 다른 컴퓨터 프로그램과 통신하도록 설계된 응용 프로그램의 특정 경우 에는 후자의 관점 을 선호하는 주장이 있습니다 . HTTP 레벨에서 클라이언트가 이러한 애플리케이션과 인터페이스하면 실제로 애플리케이션에 접속했는지 여부 만 결정됩니다. 이러한 경우 다른 모든 것들은 종종 더 높은 수준의 프로토콜을 사용하여보다 자연스럽게 전달됩니다.


어쨌든 원하는 위의보기에 관계없이 명심해야 할 몇 가지 세부 사항이 있습니다. 하나는 많은 경우에 자원과 존재하지 않는 자원 간에 의미있는 차이가있을 수 있다는 것입니다.

HTTP 레벨에서 빈 자원은 단순히 200 응답 코드와 빈 응답 본문으로 표시되고 존재하지 않는 자원은 404 응답과 자원 부재로 설명하는 자원 본문으로 표시됩니다. 상위 레벨 API 프로토콜에서는 일반적으로 적절한 프로토콜 별 오류 코드 / 메시지를 포함하는 오류 응답으로 존재하지 않는 리소스를 나타내는 반면 빈 응답은 단순히 데이터 항목이없는 정상적인 응답 구조입니다.

(위의 의미에서 자원이 문자 그대로 0 바이트 일 필요는 없습니다. 예를 들어, 일치하는 항목이없는 검색 결과는 넓은 의미에서 SQL 쿼리 결과와 같이 비어있는 것으로 계산됩니다. 행이 없거나 실제 데이터가없는 XML 문서)

또한 응용 프로그램이 요청 된 하위 리소스 가 있어야 한다고 믿지만 찾을 수 없으면 세 번째 가능한 응답 코드가 존재합니다 500 Internal Server Error. 자원의 존재가 애플리케이션에 대한 전제 조건으로 가정되는 경우, 그러한 응답은 존재하지 않는 것이 반드시 내부 오작동을 나타낼 수 있습니다.

마지막으로 Postel의 법칙을 항상 명심 해야합니다 .

" 보내는 것에 보수적이며,받는 것에 자유주의하십시오. "

서버가 여부 해야 200 또는 404 응답 특정 상황에서 응답, 그 변명하지 않는 당신 은 AS 클라이언트 구현 적절하게 응답 중 하나를 처리하지 하고 강력한 상호 운용성을 최대화하는 방식으로. 물론, 다른 상황에서 "적절한"처리가 의미하는 것은 논란의 여지가 있지만, 일반적으로 충돌 또는 "떨어짐"을 포함해서는 안됩니다.


딜레마는 잘 설명했다.
Marcel

딜레마가 없습니다. 이 답변은 관련 리소스에서 정의 된 리소스를 기반으로하지 않습니다. @ LegoStormtroopr 답변 아래 내 의견을 참조하십시오.
imel96

@ imel96 : 나는 당신이 RFC 1630을 잘못 해석 있다고 생각 : 당신이 당신의 이전 의견에 인용 단락 읽기, 전체에서 : "물음표 ("? ", ASCII 3 층 헥스)는 쿼리 가능의 URI 사이의 경계를 구분하는 데 사용됩니다 객체 및 객체에 대한 질의를 표현하는 데 단어 세트.이 폼이 사용되는 경우, 조합 된 URI 쿼리 원래 객체에 적용되는 결과 객체를 나타낸다. " (강조 내). 따라서, 쿼리 문자열이 실제로 URI의 일부임을 분명하다 (쿼리 문자열 앞에 부분은 반드시 경우에도 또한 ... 그 자체로 유효한 URI)
Ilmari 카로 넨

...이 결합 된 URI는 클라이언트가 해당 URI를 서버로 전송하여 요청할 수있는 특정 자원을 식별합니다. 어쨌든 RFC 2616 (HTTP)은 단순히 "3.2 절에 정의 된대로 URI로 식별 할 수있는 네트워크 데이터 개체 또는 서비스" 로 리소스를 정의합니다 . 하고 말을 계속 "- 이름, 위치 또는 다른 어떤 특징을 이용하여 - HTTP로서는 통일 자원 식별자를 식별 간단하게 포맷 된 문자열입니다. 자원이"
Ilmari Karonen

@IlmariKaronen 당신이 맞아요. HTTP와 REST를 혼동했습니다. ? 아직 잘 나는 당신이 / GoalTree / 가져 오기 versionDate = 2000BC 같은 URI를 자원으로 무엇을 할 수 있는지 확실하지 않다 때문에 비록 보이지 않는다
imel96

3

204 No Content는 어떻습니까? 요청이 성공적으로 처리되었지만 아무것도 반환하지 않는 것이 좋습니다. 여전히 "성공"이지만 상태 코드 만 기반으로 결과가 있는지 확인할 수 있습니다.


6
사양을 더 읽어 보면 "이 응답은 기본적으로 사용자 에이전트의 활성 문서보기를 변경하지 않고 작업에 대한 입력을 허용하기위한 것입니다." 따라서 GET 요청에 사용해서는 안됩니다.
imel96

3

URL이 존재하지 않는 리소스를 나타내는 경우 404 Not Found를 반환합니다.

URL이 빈 목록 인 리소스를 나타내는 경우 빈 목록과 200 OK를 반환합니다.

예:

{
  total: 0,
  items: []
}

URL이 존재했던 리소스를 나타내는 경우 410 Gone을 반환합니다.

레고 스톰 트루퍼의 대화에 관하여 :

Alien: Computer, please tell me all planets that humans inhabit. GET /planets?inhabitedBy=humans

Computer: 200 OK. { total: 1, items:[{name:'Earth'}] }

Alien: Computer, please tell me about Earth. GET /planets/earth

Computer: 200 OK. {name:'Earth', status: 'Mostly Harmless'}

Alien: Computer, please tell me about all planets humans inhabit, outside the asteroid belt. GET /planets?inhabitedBy=humans&distanceFromSun=lots

Computer: 200 OK. {total:0, items:[] }

Alien: Computer, please destroy Earth. DELETE /planets/earth

Computer: 204 No Content. (or 202 Accepted if it takes some time to destroy Earth)

Alien: Computer, please tell me about Earth. GET /planets/earth

Computer: 410 Gone

Alien: Computer, please tell me all planets that humans inhabit. GET /planets?inhabitedBy=humans

Computer: 200 OK 0 {total: 0, items:[] }

Alien: Victory for the mighty Irken Empire!

1

그 소리에서, 이것은 내부 용 API입니다 . 이것은 가장 제공 중 스키마 사용의 가장자리주는 혜택을 관계없이 의해 - 더 - 책인지 (사양)의 여부를. 이것은 자신의 상태 코드를 완전히 발명한다는 의미는 아니지만, 규칙이 유익하다면 규칙을 약간 '구부리는'것이 좋습니다.

문제가 있음을 나타내는 상태 코드를 받아야한다는 귀하의 입장에 동의합니다. 이것은 모든 상태 코드에 대한 것입니다. 또한 예외 등을 발생시키는 라이브러리의 이점을 얻습니다. 200이 아닌 상태 코드에서 명시 적으로 확인할 필요가 없습니다 (또는이를 수행하는 자체 래퍼를 작성할 수 있습니다).

또한 나무 존재 해야하기 때문에 500이 적합하다는 Andres F.의 견해에 동의 합니다. 실제로 서버 오류를 두 가지 범주로 나누고 싶습니다. 뭔가 예상치 못한는 잘못된 내가 실질적으로 확인할 수 있습니다 뭔가 잘못 갔다. 결과적으로 다음과 같은 상태 코드가 나타납니다.

  • 200-모든 것이 좋다
  • 404-잘못된 URL
  • 409-문제가 발생했습니다
  • 500-서버에서 예기치 않은 오류가 발생했습니다

특정 경우, 서버 측에 트리가 존재하는지 여부를 점검하고 존재하지 않는 경우 409를 리턴 할 수 있습니다. 예상되는 오류입니다 (발생할 수 있음을 알고, 점검 할 수있는 등). . 409 갈등은 저의 개인적인 취향 일뿐입니다. 팀에 앉아서 결정을 내릴 수 있다면 5xx도 적절할 수 있습니다.

이와 같은 코드를 분류하면 오류 유형을 더 빨리 식별하는 데 도움이되지만 조직 이외의 이점을 가질 수 있습니다. 종종 웹 사이트 오류가 발생하면 클라이언트가 예기치 않은 오류가 발생하는 것을 원하지 않습니다. 이는 보안 문제 일 수 있으며 취약점을 밝혀서 일반적인 500 "오류가 발생했습니다." 서버에 전체 오류를 기록하십시오. 그러나 409로 예상되는 오류가 발생하면 클라이언트에 오류를 표시하는 것이 안전 할 것이며 오류가 발생한 상황을 어두운 곳에 두지 않아도됩니다. 이것은 내가 말할 수있는 실질적인 용도 중 하나 일 뿐이지 만 많은 가능성이 있습니다.

동료와 동의 할 수 없기 때문에이 게시물을 게시하기 때문에 약간의 캐치입니다 .22 의미론에 대해 더 많이 논쟁하고 정치적으로 누가 올바른지 들립니다. 회사에 가장 이익이되는 시스템을 만들 수 있다면 누가 더 적절한가는 중요하지 않습니다.

반면에 가능한 한 가까운 사양을 따르는 공개 API 인 경우 커뮤니티 간의 혼동을 피하는 것이 더 중요합니다.


0

이것에 대한 접선 찌르기 : 인간이 궁극적으로 (GUI를 통해) API를 사용하는 경우 최종 사용자가 인생을 쉽게 할 수있는 모든 것을 제안합니다. 존재해야 할 트리가 존재하지 않는 것은 "도메인 모델 불일치"오류입니다. 시스템 오류는 메모리가 부족하거나 다른 시스템 오류가 발생한 경우입니다. 따라서 5xx를 반환하는 것은 부적절합니다. 위의 여러 사람들이 언급했듯이 트리 자체에 자체 URI가 있으면 4xx가 적합 할 수 있습니다. 여기서는 그렇지 않습니다. 그러나 404는 클라이언트에게 다음과 같이 말합니다. 무언가를 되 찾을 때까지 계속해서 시도 할 수 있습니다. 200을 리턴 한 경우, 사용자 에이전트가 측정을 표시하여 사용자가 재 시도를 중지하고 지원 담당자에게만 문의 할 수 있도록 충분한 진단을 사용자 또는 사용자 에이전트에 다시 리턴 할 수 있습니다. 반면에이 API가 시스템 전용 인 경우


404는 실제로 "그것이 여기에 없으며 어디에 있는지 모릅니다"라고 말합니다. 3xx 및 5xx는 재시도 가능합니다. 그러나 4xx는 "현재 검색어로는 충분하지 않아서 귀하를 대신 할 수 없습니다."

URL NOT FOUND와 Resource NOT FOUND를 구별 할 수있는 가능성이 마음에 듭니다. 따라서 서비스 엔드 포인트가 200 개 이상 실행 중이지만 요청 된 리소스가 404 (응답 본문)이 아닙니다.
레모네이드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.