부분적으로 성공한 요청에 대한 HTTP 상태 코드


115

사용자에게 메시지를 보내는 애플리케이션이 있습니다. 게시 요청에서 특정 메시지를 수신해야하는 모든 사용자로 구성된 XML 문자열이 전송됩니다. 목록의 사용자가 존재하지 않는 경우 추가 평가를 위해 누락 된 사용자 목록을 클라이언트에 다시 제공합니다.

이제 요청이 수락되었지만 수행 할 수없는 일이 있다는 애플리케이션의 적절한 상태 코드가 무엇인지 스스로에게 묻고 있습니다.

목록에 누락 된 사용자를 포함 할 수 없으면 문제가 발생하지 않습니다. 그런 다음 전송 시도는 4xx 오류를 얻습니다. 그러나 이런 식으로 API를 구성하는 것은 의미가 없습니다. 반면에 오류 조건은 순전히 응용 프로그램에 특정한 것으로 간주 할 수 있습니다. 그러나 200을 보내는 것은 옳지 않다고 생각합니다. 그리고 오류 응답을 자세히 살펴볼 때 클라이언트에게 힌트를 제공하는 것이 좋습니다. 예 : 해당 사용자에게 계속해서 메시지를 보내는 것을 방지하기 위해

답변:


66

나는 매우 유사한 문제를 다루었습니다. 이 경우, 나는

207 다중 상태

이제 이것은 엄격한 HTTP가 아니며 WebDAV 확장의 일부이므로 클라이언트도 제어 할 수 없다면 좋지 않습니다. 그렇게하면 다음과 같이 할 수 있습니다.

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

그러나 이것은 HTTP 확장이며 클라이언트도 제어해야합니다.


3
나는 이것을 사용하려고 생각했지만 나는 그것에 익숙하지 않았습니다. 감사!
Norbert Hartl

좋은 점은 원하는만큼 관련 데이터를 반환 할 수 있다는 것입니다. 이는 특히 혼합 데이터 세트에 유용합니다. 즉, 일부는 실패하고 일부는 통과합니다.
Kylar 2012-12-12

이해 했어요. 나는 추가 수준의 상태 처리를 피하기 위해 노력하고 있습니다 (좋은 IMHO가 아닙니다). 내 코드의 대부분은 HTTP 코드에서 작동합니다. 그리고 설명 된 사용 사례가 없이도 잘 될 것이라고 생각합니다.
Norbert Hartl 2011

언제든지 본문을 다시 보낼 수 있습니다. JSON 응답 또는 성공한 응답을 결정하기 위해 원하는대로 200을 보냅니다.
Kylar 2011

네, 알아요. 그러나 본문을 반환하면 구문 분석해야합니다. 그리고 그 순간 애플리케이션 로직 처리의 두 번째 계층을 소개합니다. 이것은 복잡성을 증가시키고 당신은 그것을 할 합당한 이유가 필요합니다.
Norbert Hartl 2011

65

나는 같은 문제가 있었고 결국 두 가지 다른 해결책을 사용했습니다.

  • HTTP return code 202: Accepted, 요청이 정상임을 나타내지 만 모든 것이 실제로 제대로 진행된다는 보장은 없습니다.
  • 200응답에 정상 을 반환 하지만 응답 본문에 표시되지 않은 항목의 목록을 포함합니다.

두 번째는 일반적으로 가장 잘 작동하지만 첫 번째는 게 으르거나 처리를 위해 대기열을 사용하는 경우에 좋습니다.


5
202는 대기열과 같은 것을 더 많이 언급하지 않습니까?
Sinaesthetic

6
예, @Sinaesthetic. 최신 HTTP 1.1 사양에서 "(...) 요청이 처리를 위해 수락되었지만 처리가 완료되지 않았습니다." 따라서 부분적인 성공의 경우 202는 적절 하지 않습니다 .
Huercio 19

-4

206 부분 콘텐츠를 사용하는 것은 어떻습니까? 206이 범위에 대해 더 많이 알고 있지만 부분적으로 성공적으로 요청했음을 나타낼 수 있다면 어떻게됩니까?


MDN 은 다음과 같이 설명합니다. "HTTP 206 부분 콘텐츠 성공 상태 응답 코드는 요청이 성공했으며 요청의 범위 헤더에 설명 된대로 본문에 요청 된 데이터 범위가 포함되어 있음을 나타냅니다." 내가 아는 한, 206 Partial Content는 콘텐츠 범위가있는 요청을위한 것입니다.
sbbs

-14

HyperText Transfer Protocol은 사물의 전송 측면을 다룹니다. 애플리케이션 수준 오류를 처리하기위한 오류 코드가 없습니다.

여기서 200을 반환하는 것이 옳은 일입니다. HTTP에 관한 한 요청이 제대로 수신되고 올바르게 처리되었으며 응답을 다시 보냅니다. 따라서 HTTP 수준에서는 모든 것이 정상입니다. http 위에서 실행되는 응용 프로그램과 관련된 모든 오류 또는 경고는 응답 내에 있어야합니다. 이렇게하면 특정 응답을 예상 한 방식으로 처리하지 못할 수있는 프록시 서버에서 발생할 수있는 몇 가지 불쾌한 문제도 방지 할 수 있습니다.


18
HTTP는 응용 프로그램 수준 프로토콜입니다. 단순히 운송 및 적용 수준에 놓을 수는 없습니다. OSI에 대해 생각한다면 HTTP는 레이어 5-7에 있습니다. HTTP는 약간 다릅니다. 대부분의 헤더와 리턴 코드는 실제로 애플리케이션에 따라 다릅니다. 코드는 사용자 정의 애플리케이션 형식이 아닌 HTTP 프로토콜 엔티티에 제공된 정보에 의존합니다. 200에 관해서는 POST가 아닌 동사에 적용되면 정의가 완전히 잘못되었다고 말할 수 있습니다. 그러나 POST는 게임을 조금 변경이 상황에서 당신의 가정은 "제대로 처리"확실하지 않다, 중
노르 베르트있는 Hartl에게

엄밀히 말하면 OSI는 HTTP를 애플리케이션 레벨 프로토콜로 간주하고 '일반'웹 서버와 대화 할 때 이는 사실입니다. 그러나 귀하의 경우에는 요즘 많은 응용 프로그램처럼 HTTP 위에서 자체 프로토콜을 실행하고 있습니다. 이러한 유형의 사용에서 HTTP는 전송을 제공합니다. (귀하의 애플리케이션은 하이퍼 텍스트를 전송하지 않고 사용자에게 메시지를 보내고 있습니다 ...)
AVee

2
명확하게. REST 방식의 HTTP는 리소스 중심입니다. 이 문맥에서 200은 ID의 방향을 가리키는 3xx 대신 ID (지정한 리소스)를 의미합니다. POST를 사용하면 리소스 URI가 처리 URI로 바뀌고 이에 대처해야하는 오류 코드가 있습니다. 컨텍스트는 비트와 사물의 (고화질)이 이해하기 어려운 비트 흐리거나 적어도 얻을 이동
노르 베르트있는 Hartl

1
컨텍스트 시프트는 또한 프로토콜이 해당 컨텍스트를 염두에두고 설계되지 않았기 때문에 적절한 오류 코드가 없음을 의미합니다 ;-) 프록시 서버가 응답을 a로 대체하는 경향이 있기 때문에 오류 코드를 사용하는 데주의해야한다고 생각합니다. 사용자 지정 오류 페이지, 이것은 실제 PITA 일 수 있습니다.
AVee 2011-12-12

1
어쨌든 제 질문에 답 해주셔서 감사합니다. 난 그냥 발견 유래가 : 나쁜 채팅 클라이언트입니다
노르 베르트있는 Hartl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.