HTTP GET에 대한 응답으로 202“Accepted”를 반환하는 것이 잘못입니까?


89

표현이 느리게 생성 된 리소스 집합이 있습니다. 이러한 표현을 구성하는 계산은 서버 부하, 특정 리소스 및 달의 위상에 따라 몇 밀리 초에서 몇 시간까지 걸릴 수 있습니다.

리소스에 대해 수신 된 첫 번째 GET 요청은 서버에서 계산을 시작합니다. 계산이 몇 초 내에 완료되면 계산 된 표현이 반환됩니다. 그렇지 않으면 202 "Accepted"상태 코드가 반환되고 클라이언트는 최종 표현을 사용할 수있을 때까지 리소스를 폴링해야합니다.

이 동작의 이유는 다음과 같습니다. 결과가 몇 초 내에 사용 가능하면 가능한 한 빨리 검색해야합니다. 그렇지 않으면 언제 사용할 수 있는지는 중요하지 않습니다.

제한된 메모리와 엄청난 양의 요청으로 인해 NIO 나 긴 폴링은 옵션 이 아닙니다. , 거의 충분한 연결을 열어 둘 수 없으며 모든 요청을 메모리에 넣을 수도 없습니다. 한 번 "몇 초" 통과되면 초과 요청을 지속합니다). 마찬가지로 클라이언트 제한으로 인해 완료 콜백을 대신 처리 할 수 ​​없습니다. 마지막으로, 하나가 POST를 수행하는 "공장"리소스를 만드는 데 관심이 없습니다. 추가 왕복은 우리가 원하는 것보다 더 많이 조각 별 실시간 제약 조건을 실패한다는 것을 의미하기 때문입니다. 캐싱의 이점).

GET 요청에 대한 응답으로 202 "Accepted"상태 코드를 반환하는 것에 대해 논란이 있다고 생각합니다. 실제로는 본 적이 없으며 가장 직관적 인 사용은 안전하지 않은 메서드에 대한 응답이지만 특별히 낙담시키는 것을 발견했습니다. 또한 나는 안전과 멱 등성을 모두 보존하고 있지 않습니까?

그렇다면 사람들은이 접근 방식에 대해 어떻게 생각합니까?

편집 : 나는 이것이 브라우저가 아니라 소위 비즈니스 웹 API에 대한 것이라고 언급해야합니다.


2
나는 개인적으로, 그것은 좋은 하나의 생각 을 정확하게 a의 정의 202. 실제로 거의 사용되지 않는 것은 IMHO입니다. 왜냐하면 브라우저 / 사용자-에이전트 상호 작용에 더 익숙해지기 때문에 적절한 상태 코드에 관심이있는 웹 개발자가 거의 없기 때문에 a 202가 눈에 띄는 단서를 제공하지 않는 경우에 200만족합니다. ..).
Wrikken 2010

1
@ user359996, 그냥 200. 202그것이 되어야 하는 것이지만, 실제로 사람들은 202.
Pacerier

하지만 실제로 200이 유용하려면 ETA가 필요합니다.
Rob

답변:


66

잘 정의되고 문서화 된 API에 대한 것이라면 무슨 일이 일어나고 있는지 정확하게202 들립니다 .

공용 인터넷의 경우 클라이언트 호환성이 너무 걱정됩니다. 나는 너무 많은 if (status == 200)하드 코딩 된 것을 보았다 ....이 경우 나는 200.

또한 RFC 는 GET 요청에 202를 사용하는 것이 잘못되었다는 표시를하지 않고 다른 코드 설명 (예 : 200)에서 명확하게 구분합니다.

처리를 위해 요청이 수락되었지만 처리가 완료되지 않았습니다.


16

우리는 최근 애플리케이션에 대해 이렇게했습니다. 클라이언트 (브라우저가 아닌 사용자 정의 애플리케이션)는 쿼리를 POST하고 서버는 게시되는 "작업"에 대한 URI와 함께 202를 반환합니다. 클라이언트는 해당 URI를 사용하여 결과-이것은 수행중인 작업에 잘 맞는 것 같습니다.

여기서 가장 중요한 것은 서비스 / API의 작동 방식과 202의 응답이 의미하는 바를 문서화하는 것입니다.


+1 의견 주셔서 감사합니다. 문서에 대한 좋은 점. 그러나 내 질문에 대한 명확한 수정 사항에 유의하십시오 ( "factory"찾기).
user359996 2010

처음에 요청한 것과 동일한 URI를 폴링하려는 경우 응답에서 해당 URI를 생략 할 수 있습니다. (이것이 어떻게 작동하는지 문서화하십시오 :-))
nos

좋은 생각이지만 캐싱을 원하므로 POST가 필요하지 않습니다. 또한 URI는 메서드가 아닌 리소스를 지정합니다. RPC 접근 방식이 아닌 RESTful 방식을 사용하고 있습니다 (미안합니다. 지정되지 않은 또 다른 제약 사항입니다.
user359996 2010

정확히 말하면 "RESTful"은 실제로 "자원 지향"을 의미하며, 이는 기술적으로 REST 제약 조건에 의해 지정되는 것보다 약간 더 많습니다.
user359996 2010

12

내가 기억할 수있는 것에서-GET은 서버를 수정하지 않고 리소스를 반환해야합니다. 활동이 기록되거나 무엇을 가지고 있을지 모르지만 동일한 결과로 요청을 다시 실행할 수 있어야합니다.

반면에 POST는 서버의 상태를 변경하라는 요청입니다. 레코드를 삽입하고, 레코드를 삭제하고, 작업을 실행합니다. 202는 반환되었지만 완료되지 않은 POST에 적합하지만 실제로 GET 요청은 아닙니다.

그것은 모두 매우 청교적이고 야생에서 잘 수행되지 않았으므로 202를 반환하면 안전 할 것입니다. GET은 200을 반환해야합니다. POST는 완료되면 200을 반환하고 완료되지 않은 경우 202를 반환 할 수 있습니다.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


4
아주 좋은 생각이지만 여기에 적용되는지 확실하지 않습니다 .OP가 말한 것에서 이것은 적절한 GET 요청 인 것 같습니다 (서버에서 아무것도 변경하지 않는다는 점에서), 계산하는 데 더 오래 걸립니다. 이 경우 다른 시간에 가져올 수 있습니다. 아마도 OP는 권위있는 의견을 줄 수 있습니다. API를위한 것이기 때문에 깨끗한 인터페이스를 위해 "순수 적"인 것이 좋습니다
Pekka

오, 펙 카를 만지세요. 당신 말이 맞아요, GET은 갈 길입니다. 그리고 HTTP spc가 준비되지 않은 GET을 실제로 고려하지 않았다고 생각합니다. 그래서 그는 어느 쪽이든 갈 수있었습니다
Dlongnecker 2010

7
(현재는 관련이 없음) 권위있는 의견 : 예, 저는 이것을 멱 등성으로 봅니다. 리소스 둘 오히려의 수정하지 않고 생성되는 표현은 아직 계산되지 않았다.
user359996 2010

1
그게 뭐라고하나요? 또한 내가 200을 반환하면 클라이언트는 표현이 반환되었다고 예상해야하지만 그렇지 않습니다.
user359996 2010

1
나는 그것을 되 찾는다. 202는 GET 또는 POST에만 해당하지 않습니다. 프로토콜을 보았을 때의 마음가짐으로 인해 202는 GET 요청에만 존재했습니다. 202는 귀하의 목적에 적합합니다.
Dlongnecker 2010

0

ID (질문에 설명 된 "공장"리소스와 반대)로 명확하게 지정된 엔티티를 표현해야하는 리소스의 경우 GET 메서드를 사용하는 것이 좋습니다. 지연 생성 또는 기타 일시적인 상황으로 인해 엔티티 / 표현을 사용할 수없는 상황에서는 더 적절하고 실제로 이와 같은 상황에 맞게 설계된 503 Service Unavailable 응답 코드를 사용합니다.

이에 대한 이유는 HTTP 자체에 대한 RFC (503 응답 코드에 대한 설명을 확인하십시오) 및 기타 여러 리소스에서 찾을 수 있습니다.

일시적으로 사용할 수없는 페이지에 대해서는 HTTP 상태 코드 와 비교하십시오 . 이 질문은 다른 사용 사례에 관한 것이지만 실제로는 HTTP의 똑같은 기능과 관련이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.