2012-12-13 2 views
8

나는 다음과 같은 디자인 패턴을 가로 질러 비동기 작업의 RESTful API를 연구하는 동안 : pendingOperation REST : HTTP 303이 비동기 작업에 유해한 것으로 간주됩니까?

GET uri:pendingOperation 반환 :

POST uri:longOperation 반환 :

  • HTTP 202
  • 위치 : URI를 :

    • 작업이 실행중인 경우
      • 진행률 보고서를 반환합니다.
    • 작업이 완료되면
      • HTTP 303
      • 위치 : URI : operationResponse

    GET uri:operationResponse

    • 비동기의 응답 운이 좋은 수술

    나는 마지막 단계를 의심 스럽다. 비동기 작업이 HTTP GET에 적합하지 않은 오류 코드 (예 : HTTP 409 ("Conflict"))로 완료되면 어떻게되는지 고려하십시오. pendingOperationURI 반대 : operationResponse

    1. URI와 관련된 응답을 가리 할 필요가 없습니다 HTTP 303 있습니까?
    2. 이렇게하면 HTTP 303이 유해한 것으로 간주됩니까? 그렇지 않다면, 왜?
    3. 우리가 할 수있는 최선인가, 아니면 더 좋은 방법이 있습니까?

답변

6

는 HTTP (303)는 URI와 관련된 응답을 가리 할 필요가 없습니다 : pendingOperation URI 반대 : operationResponse를?

spec에는 명시 적으로 필수 사항은 아니지만 동의하는 경향이 있습니다.

이러한 방식으로 HTTP 303을 사용하면 유해하다고 생각합니까? 그렇지 않다면, 왜?

나는 당신이 완료되면 자동 리디렉션을 "좋은"있는 동안 (303)을 수행하여 능력을 잃을 생각은 결과의 주위에 메타 데이터를 제공 할 수있는 기회를하지 않도록, 그, 그것을 만들어 보고 등을 위해 활용 될 수 있습니다. 또한 많은 고객이 303을 따르지 않으므로 클라이언트는 303 위치 헤더를 따르는 작업을 수행해야 할 수 있습니다.

우리가 할 수있는 최선인가, 아니면 더 좋은 방법이 있습니까?

GET uri:pendingOperation 반환 200을 상태 자원이 "완료"일 때 항상 출력으로 참조하는 것이 좋습니다.

같은 것을 할 때 불완전

{ 
    "status" : "PENDING" 
} 

오류

{ 
    "status" : "COMPLETE" 
    "errors" : [ 
     { 
      "typeId" : "OPERATION_TIMEOUT", 
      "description" : " "The request was unable to complete because the systems are unresponsive". 
     } 
    ] 
} 

성공적인

{ 
    "status" : "COMPLETE" 
    "links" : { 
     "result" : { 
      "href" : "http://api.example.com/finished-resource/1234", 
     } 
    ] 
} 

,