2013-05-19 5 views
2

나는 원칙적으로 매우 간단 백업 서비스를위한 REST API를 만드는거야 : 사용자가 어떤 uid에 의해 식별됩니다"POST to PUT redirect"로 REST API를 모델링하는 방법은 무엇입니까?

  • 을;
  • 파일은 일부 fid로 식별됩니다. 사용자 GET/backups/<uid>
  • 이 파일을 다운로드 반환 fid의 일부 인덱스, 사용자
  • /backups/<uid>에, 사용자 POST SA 파일을 파일을 업로드하고 위치가 파일을 나열
  • 을 반환 인덱스에서 하나를 선택하면 이 반환되고 파일이 반환됩니다.

이제 Amazon S3와 같은 서비스에 위임 및 다운로드를 위임하여 서버 트래픽을 크게 줄이고 싶습니다.

만료 된 생성 된 URL에 대한 정규 리디렉션 (301 또는 307?)을 수행 할 수 있기 때문에 다운로드를 리디렉션하는 것이 문제가되지 않습니다.

하지만 업로드 한 내용은 무엇입니까?

  • 서버가 헤더만을 받아 내 서버 (S3의 인식)

    • 사용자 POST 파일로 시작
    • 서버 : 나는 이런 식으로 뭔가를하도록 노력하겠습니다 (안 전체 파일을!) , S3에있는 장소를 결정 PUT에 대한 만료 URL을 생성하고 클라이언트 PUT의 그것을
    • 에이 서버가 성공적으로 업로드 통지
    • 서버가 물려 받았습니다 URL로 파일을 리디렉션

    요점은 모든 것이 가능한 한 사용자에게 투명해야한다는 것입니다.

  • 답변

    2

    초기 POST가 전체 엔티티를 포함해야한다고 생각하지 않습니다. 오히려 POST는 명시 적으로 "업로드 버킷"리소스가 생성되도록 요청해야합니다. 그런 다음 파일을 업로드해야하는 새 리소스를 가리키는 Location 헤더가있는 201 Created으로 POST 요청에 응답하면됩니다.

    선택한 업로드 버킷이 파일의 세부 사항 (파일 크기, 유형)에 따라 달라지는 경우 클라이언트가 POST 본문에 메타 데이터를 제출하도록합니다.

    +0

    이 경우 'PUT'에 대한'Location'은 이후에 더 이상 유효하지 않습니까? 보통'PUT'이라면,'GET' 할 수 있기를 기대합니다. –

    +0

    나는 그런 기대가 없다고 생각한다. 특정 시점 (PUT 직후)에 다른 클라이언트가 특정 자원에 대해 DELETE를 발행 할 수 있습니다. 설명하는 "PUT, GET"시퀀스는 거래 내에서 발생하지 않습니다. –

    +0

    좀 더 정확히 말하면, PUT 직후에 GET이 PUT 된 엔터티를 반환한다는 "기대"가 있다고 말할 수 있다고 생각합니다. 그러나이 경우에는 * 요구 사항 *이 없습니다. 클라이언트의 기대치가 충족되지 않으면 다른 클라이언트가 리소스로 소란을 피우고 있음을 나타냅니다. –

    관련 문제