Programing

S3 REST API 및 POST 방법

lottogame 2020. 12. 6. 20:53
반응형

S3 REST API 및 POST 방법


내가 사용하고 AWS S3 REST API를 하고, 서명과 함께 몇 가지 성가신 문제를 해결 한 후이 작동하는 것 같다. 그러나 리소스를 만들기 위해 올바른 REST 동사를 사용 POST하면 405 method not allowed. 동일한 요청이 메서드에서 잘 작동 PUT하고 리소스를 생성합니다.

내가 뭔가 잘못했거나 AWS S3 REST API가 REST와 완전히 호환되지 않습니까?


예, CRUD를 HTTP 메서드에 매핑하는 데 잘못되었습니다.

Stack Overflow에 대한 높은 등급의 답변을 포함하여 대중적인 사용과 광범위한 오해에도 불구하고 POST는 "리소스를 생성하는 올바른 방법"이 아닙니다. 다른 메소드의 의미는 HTTP 프로토콜에 의해 결정되지만 POST의 의미는 대상 미디어 유형 자체에 의해 결정됩니다. POST는 HTTP에 의해 표준화되지 않은 모든 작업에 사용되는 방법이므로 생성에 사용할 수 있지만 업데이트 또는 다른 방법으로 아직 수행되지 않은 다른 작업에도 사용할 수 있습니다. 예를 들어, GET을 표준화했기 때문에 검색에 POST를 사용하는 것은 잘못되었지만 클라이언트가 어떤 이유로 PUT를 사용할 수없는 경우 리소스를 생성하는 데 POST를 사용하는 것이 좋습니다.

마찬가지로 PUT는 "리소스를 업데이트하는 올바른 방법"이 아닙니다. PUT는 현재 상태를 무시하고 리소스를 완전히 교체하는 데 사용되는 방법입니다. 서버가 예상하는 전체 표현이있는 경우 생성에 PUT를 사용할 수 있으며 변경하지 않을 부분을 포함하여 전체 표현을 제공하는 경우 업데이트에 PUT를 사용할 수 있지만 부분 업데이트에 PUT를 사용하는 것은 올바르지 않습니다. , 서버가 리소스의 현재 상태를 고려하도록 요청하기 때문입니다. PATCH는이를 수행하는 방법입니다.

비공식 언어에서 각 방법이 서버에 말하는 내용은 다음과 같습니다.

  • POST : 리소스 미디어 유형에 대해 문서화 한 규칙에 따라이 데이터를 가져 와서 주어진 URI로 식별 된 리소스에 적용합니다.

  • PUT : 주어진 URI에 의해 식별되는 모든 것을이 데이터로 대체하고 이미있는 모든 것을 무시합니다.

  • PATCH : 주어진 URI로 식별되는 리소스가 마지막으로 보았을 때와 동일한 상태 인 경우이 diff를 적용합니다.

생성 또는 업데이트가 언급되지 않았으며 해당 메서드의 의미 체계의 일부가 아닙니다. 현재 상태에 따라 다르기 때문에 POST 및 PUT로 만들 수 있지만 PATCH로는 만들 수 없습니다. 그들 중 하나로 업데이트 할 수 있지만 PATCH를 사용하면 업데이트하려는 상태에 대한 조건부 업데이트가 있으며 PUT를 사용하면 전체 엔티티를 대체하여 업데이트하므로 멱등 작업이며 POST를 사용하면 서버에 요청합니다. 미리 정의 된 규칙에 따라.

그건 그렇고, REST는 사양이나 표준이 아닌 아키텍처 스타일 이기 때문에 API가 REST를 준수하는지 여부를 말하는 것이 합리적 일지 모르겠습니다. REST라고 주장하는 것은 실제로 RESTful입니다. 대부분의 경우 하이퍼 텍스트 기반 이 아니기 때문 입니다. AWS S3는 확실히 RESTful이 아니지만, 귀하의 질문에 해당하는 부분에서 HTTP 메서드 사용은 대부분의 경우 HTTP 표준을 따릅니다.


+--------------------------------------+---------------------+
|                 POST                 |         PUT         |
+--------------------------------------+---------------------+
| Neither safe nor idempotent Ex: x++; | Idempotent Ex: x=1; |
+--------------------------------------+---------------------+

@Nicholos에 추가하려면

로부터 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

게시하다:

게시 된 엔티티는 파일이 포함 된 디렉토리에 종속되거나 뉴스 기사가 게시 된 뉴스 그룹에 종속되거나 레코드가 데이터베이스에 종속되는 것과 동일한 방식으로 URI에 종속됩니다.

POST 메소드에 의해 수행되는 조치로 인해 URI로 식별 할 수있는 자원이 생성되지 않을 수 있습니다. 이 경우 응답에 결과를 설명하는 엔티티가 포함되는지 여부에 따라 200 (OK) 또는 204 (No Content)가 적절한 응답 상태입니다.

원본 서버에 리소스가 생성 된 경우 응답은 201 (Created)이어야합니다.

놓다:

PUT 메소드는 동봉 된 엔티티가 제공된 Request-URI 아래에 저장되도록 요청합니다. Request-URI가 이미 존재하는 자원을 참조하는 경우, 동봉 된 엔티티는 원본 서버에있는 자원의 수정 된 버전으로 간주되어야합니다 (SHOULD). Request-URI가 기존 리소스를 가리 키지 않고 해당 URI가 요청하는 사용자 에이전트에 의해 새 리소스로 정의 될 수있는 경우 원본 서버는 해당 URI로 리소스를 생성 할 수 있습니다. 새 리소스가 생성되면 원본 서버는 201 (Created) 응답을 통해 사용자 에이전트에 알려야합니다. 기존 리소스가 수정 된 경우 요청이 성공적으로 완료되었음을 나타 내기 위해 200 (OK) 또는 204 (No Content) 응답 코드를 전송해야합니다 (SHOULD).

IMO PUT는 동봉 된 엔티티를 생성하거나 수정 / 교체하는 데 사용할 수 있습니다.


에서 원래 HTTP 사양 , POST 요청의 페이로드에 주어진 자원 (즉, 요청 URL) "지정된 개체에 종속로 간주"된다. TimBL은 이전에 (참조를 찾을 수 없음) NNTP에서 동일한 이름의 방법 으로 모델링되었다고 말했습니다 .

참고 URL : https://stackoverflow.com/questions/19843480/s3-rest-api-and-post-method

반응형