[http] “준비되지 않았지만 나중에 다시 시도하십시오”에 대해 REST API에서 HTTP 상태 코드를 어떻게 선택합니까? [닫은]

http://server/thingyapi/thingyblob/1234다운로드 할 항목 # 1234와 관련된 파일 (일명 “blob”) 을 반환 하는 RESTful API를 개발 중 입니다. 그러나 파일이 서버에 존재하지 않을 때 요청이 이루어 지지만 나중에 가장 확실 하게 사용 가능할 수 있습니다. 서버에는 모든 것들에 대한 모든 얼룩을 생성하는 배치 프로세스가 있습니다. Thingy 1234가 이미 존재하고 Blob 이외의 데이터가 이미 사용 가능합니다. 서버는 아직 1234의 Blob을 생성하지 않아도됩니다.

404를 반환하고 싶지 않습니다. 그것은 존재하지 않는 것들을위한 것입니다. 이것은 존재하지만 그 얼룩은 아직 생성되지 않은 것입니다. “처리 중”인 YouTube 동영상을 좋아합니다. 리디렉션 코드도 적절하지 않다고 생각합니다. 시도 할 “다른”URL이 없습니다.

이 경우 올바른 HTTP 상태 코드는 무엇입니까?



답변

나는 제안한다 202 - Accepted. 로부터 문서 :

요청이 처리를 위해 승인되었지만 처리가 완료되지 않았습니다. […] 그 목적은 서버가 다른 프로세스 (아마도 하루에 한 번만 실행되는 배치 지향 프로세스)에 대한 요청을 수락하도록하는 것입니다.


답변

“문제”는 서버 측에 있습니다. 클라이언트가 올바른 형식의 요청을했지만 서버가이를 충족시킬 수 없습니다. 그래서 나는 “서버 오류”, 5xx 상태 코드에 관심이 있습니다.

Quoth RFC 7231 (현재 HTTP 표준, 강조 추가) :

5xx (서버 오류) 상태 코드 클래스는 서버가 서버가 요청 된 메소드를 잘못 했거나 수행 할 수 없음을 인식하고 있음을 나타냅니다 . HEAD 요청에 응답 할 때를 제외하고, 서버는 오류 상황에 대한 설명과 일시적 또는 영구 조건 인지 여부를 포함하는 표현을 보내야합니다 .

노트

  • ” 요청을 수행 할 수 없거나 오류 가 발생했습니다”: “서버 오류”라는 제목에도 불구하고 서버 오류만을위한 것이 아닙니다.
  • 임시 또는 영구”:이 코드는 귀하와 같은 일시적으로 사용할 수없는 리소스에 적합합니다.

사용 가능한 코드 중에서 503은 “서비스를 사용할 수 없음” 이 가장 적합 하다고 말합니다 .

503 (Service Unavailable) 상태 코드는 서버가 일시적 과부하 또는 예정된 유지 보수로 인해 현재 요청을 처리 할 수 ​​없음을 나타냅니다. 이는 약간의 지연 후에 완화 될 수 있습니다. 서버는 Retry-After 헤더 필드를 보내서 요청을 재 시도하기 전에 클라이언트가 기다리는 시간을 제안 할 수 있습니다.

노트 :

  • “약간의 지연 후에 완화 될 수 있습니다”: 귀하의 경우에는 해당됩니다.
  • “임시 과부하”: 귀하의 경우에는 사실이 아닙니다. 그러나이 주장 할 수있는, 클라이언트가 요청을하면 서버가 훨씬 더 빨리, 일괄 처리가 이미 있으므로, 수행했을했다 입니다 클라이언트가 할 수 빨리 서버가 아닌 리소스를 요구하고있다 “과부하”의 종류 사용할 수 있습니다.
  • 재 시도는 서비스에 적합하므로 회신에 Retry-After값 이 포함되어야 합니다. 다음 일괄 프로세스 실행의 예상 완료 시간 또는 일괄 프로세스의 실행 간격을 값으로 제공 할 수 있습니다.

허용 되지만 자신의 5xx 상태 코드 (예 : 591)를 정의 하면 잘못된 의미가 있습니다.

클라이언트는 첫 번째 숫자로 표시되는 모든 상태 코드의 클래스를 이해하고 인식 할 수없는 상태 코드를 해당 클래스의 x00 상태 코드와 동등한 것으로 취급해야합니다.

클라이언트는 자신의 상태 코드를 500, “내부 서버 오류” 로 취급합니다 .


답변

나는 423-Locked 가이 목적으로 사용될 수 있다고 생각합니다 .

423 (Locked) 상태 코드는 메소드의 소스 또는 대상 자원이 잠겨 있음을 의미합니다. 이 응답에는 ‘잠금 토큰 제출’또는 ‘충돌 방지 잠금’과 같은 적절한 사전 조건 또는 사후 조건 코드가 포함되어야합니다.


답변

404를 반환하고 싶지 않습니다. 그것은 존재하지 않는 것들을위한 것입니다.

URL이 사물 요청에 해당하지 않습니다.

http://server/thingyapi/thingyblob/1234

클라이언트가 존재하지 않는 상황을 요청하고 있습니다. 그것이 존재한다면, 당신은 그들에게 줄 것입니다.

404.


답변

다른 옵션 : 503 - Service Unavailable.


답변

리소스가 준비되지 않았으므로 리소스를 사용할 수있는시기와 클라이언트가 요청을 다시 시도 할 수있는시기를 알 수 있습니다. 즉, Retry-After header 를 사용할 수 있습니다 . 이 헤더는 503 (서비스를 사용할 수 없음)과 함께 유효합니다. 즉, 유지 관리를 위해 전체 사이트가 다운되었으며 3xx (리디렉션) 응답입니다.

내 의견으로는 Retry-After 헤더가있는 302 (Found)가 가장 좋은 옵션이지만 응답 헤더의 Location 필드가 url을 요청할 수 있는지 확실하지 않습니다. 어쨌든 순환 리디렉션입니다.


답변

409 갈등

여러 업데이트의 경우 편집 충돌과 같이 요청 충돌로 인해 요청을 처리 할 수 ​​없음을 나타냅니다. [출처 Wikipedia.]

이것은 적절할 수 있습니다.

데이터를 반환하여 요청을 이행 할 수 없으면 성공하지 못합니다. 202는 서버가 요청을 큐에 넣었고 나중에 요청을 이행 할 것이라고 제안합니다. 그러나 귀하의 경우 현재 데이터 요청이 실패했습니다. 나중에 다시 시도하면 다른 요청입니다.

충돌이 있다고 생각합니다. 데이터를 원하지만 편집 / 업데이트하고 있습니다. Thingy1234가 이미 존재하고 이전에 성공적으로 다운로드되었지만 지금은 편집중인 프로세스를 사용할 수 없었지만 편집이 진행중인 경우에도 마찬가지입니다.