답변:
HTTP PUT :
PUT은 파일 또는 리소스를 특정 URI에 정확하게 해당 URI에 넣습니다. 해당 URI에 파일이나 리소스가 이미 있으면 PUT은 해당 파일이나 리소스를 대체합니다. 파일이나 리소스가 없으면 PUT에서 파일이나 리소스를 만듭니다. PUT은 dem 등원 이지만 역설적으로 PUT 응답은 캐시 할 수 없습니다.
HTTP POST :
POST는 데이터를 특정 URI로 보내고 해당 URI의 리소스가 요청을 처리 할 것으로 예상합니다. 이 시점에서 웹 서버는 지정된 자원의 컨텍스트에서 데이터로 수행 할 작업을 결정할 수 있습니다. POST 메소드는 idempotent 가 아니지만 서버가 적절한 Cache-Control 및 Expires 헤더를 설정하는 한 POST 응답 은 캐시 가능합니다.
공식 HTTP RFC는 POST를 다음과 같이 지정합니다.
POST와 PUT의 차이점 :
RFC 자체는 핵심 차이점을 설명합니다.
POST와 PUT 요청의 근본적인 차이점은 Request-URI의 다른 의미에 반영됩니다. POST 요청의 URI는 동봉 된 엔터티를 처리 할 리소스를 식별합니다. 해당 리소스는 데이터 수락 프로세스, 다른 프로토콜의 게이트웨이 또는 주석을 허용하는 별도의 엔터티 일 수 있습니다. 반대로 PUT 요청의 URI는 요청으로 둘러싸인 엔티티를 식별합니다. 사용자 에이전트는 어떤 URI가 의도되어 있는지 알고 서버는 요청을 다른 자원에 적용해서는 안됩니다. 서버가 요청을 다른 URI에 적용하려면 301 (영구적으로 이동) 응답을 보내야합니다. 그런 다음 사용자 에이전트는 요청을 리디렉션할지 여부에 대한 자체 결정을 내릴 수 있습니다.
또한 RFC 7231 섹션 4.3.4 PUT 상태 (강조 추가)
4.3.4. 놓다
PUT 메소드는 대상 자원 의 상태가 요청 메시지 페이로드에 포함 된 표시에 의해 정의 된 상태
created
또는replaced
상태가되도록 요청합니다.
적절한 방법을 사용하면 관련이 없습니다.
REST ROA 와 SOAP의 장점 중 하나 는 HTTP REST ROA를 사용할 때 HTTP 동사 / 방법의 올바른 사용을 장려한다는 것입니다. 예를 들어 정확한 위치에 리소스를 만들려는 경우에만 PUT을 사용합니다. 그리고 GET을 사용하여 리소스를 만들거나 수정하지 않습니다.
If the Request-URI does not point to an existing resource [...] the origin server *can* create the resource with that URI
. 존재하지 않는 경우 리소스 생성을 거부하는 PUT의 구현이 맞습니까? 그렇다면 실제로 이런 일이 발생합니까? 아니면 구현은 일반적으로 PUT에서도 생성됩니까?
REST 스타일 자원의 예를 제공하려면 다음을 수행하십시오.
많은 책 정보가 포함 된 "POST / books"는 새로운 책을 만들고 해당 책을 식별하는 새로운 URL로 응답합니다 : "/ books / 5".
"PUT / books / 5"는 id가 5 인 새 책을 만들거나 기존 책을 ID 5로 바꿔야합니다.
비자 원 스타일에서 POST는 부작용이있는 모든 것에 사용될 수 있습니다. 또 다른 차이점은 PUT은 dem 등원이어야한다는 것입니다. 여러 개의 POST가 여러 개의 오브젝트를 작성하거나 POST 조치가 수행하는 모든 작업을 수행 할 수 있지만 동일한 URL에 동일한 데이터의 여러 PUT은 양호해야합니다.
내가 아는 한 PUT은 주로 레코드를 업데이트하는 데 사용됩니다.
POST-문서 또는 기타 리소스를 만들려면
PUT-작성된 문서 또는 기타 자원을 업데이트합니다.
그러나 PUT은 일반적으로 기존 레코드가있는 경우 기존 레코드를 '대체'하고 존재하지 않는 경우 작성합니다.
다음을 참조하십시오 : http://zacharyvoase.com/2009/07/03/http-post-put-diff/
웹 개발자가 POST를 사용하여 리소스를 만드는 데 사용되고 PUT을 사용하여 리소스를 업데이트 / 변경하는 데 대한 대중의 오해로 인해 최근 화가났습니다.
RFC 2616 ( "하이퍼 텍스트 전송 프로토콜 – HTTP / 1.1") 섹션 9.6 ( "PUT") 55 페이지를 보면 PUT의 실제 내용을 확인할 수 있습니다.
PUT 메소드는 동봉 된 엔티티가 제공된 Request-URI 아래에 저장되도록 요청합니다.
POST와 PUT의 차이점을 설명하는 편리한 단락도 있습니다.
POST와 PUT 요청의 근본적인 차이점은 Request-URI의 다른 의미에 반영됩니다. POST 요청의 URI는 동봉 된 엔터티를 처리 할 리소스를 식별합니다. 이 리소스는 데이터 수락 프로세스, 다른 프로토콜의 게이트웨이 또는 주석을 허용하는 별도의 엔티티 일 수 있습니다. 반대로, PUT 요청의 URI는 요청으로 둘러싸인 엔티티를 식별합니다. 사용자 에이전트는 의도 된 URI를 알고 있으며 서버는 다른 자원에 요청을 적용해서는 안됩니다.
업데이트 / 생성의 차이점에 대해서는 언급하지 않았습니다. 왜냐하면 그것이 중요하지 않기 때문입니다. 이것의 차이점에 관한 것입니다.
obj.set_attribute(value) # A POST request.
이:
obj.attribute = value # A PUT request.
따라서이 대중적인 오해의 확산을 멈추십시오. RFC를 읽으십시오.
REST는 개발자에게 HTTP 메소드를 명시 적으로 그리고 프로토콜 정의와 일치하는 방식으로 사용하도록 요청합니다. 이 기본 REST 설계 원칙은 CRUD (작성, 읽기, 업데이트 및 삭제) 조작과 HTTP 메소드간에 일대일 맵핑을 설정합니다. 이 매핑에 따르면 :
• 서버에서 리소스를 만들려면 POST를 사용하십시오.
• 리소스를 검색하려면 GET을 사용하십시오.
• 자원 상태를 변경하거나 업데이트하려면 PUT을 사용하십시오.
• 리소스를 제거하거나 삭제하려면 DELETE를 사용하십시오.
추가 정보 : RESTful 웹 서비스 : IBM의 기본 사항
하나 또는 다른 것을 사용할 때는 매우 간단해야하지만 복잡한 표현은 많은 사람들에게 혼란의 원천입니다.
PUT
이미 자원 콜렉션의 일부인 단일 자원을 수정하려는 경우에 사용하십시오 . PUT
자원을 완전히 대체합니다. 예:PUT /resources/:resourceId
참고 :PATCH
리소스의 일부를 업데이트하려는 경우 사용하십시오 .
POST
자원 콜렉션 아래에 하위 자원을 추가하려는 경우에 사용하십시오 . POST => /resources
PUT
에 대한 업데이트 작업.POST
에 대한 CREATE 작업을.GET
/ company / reports => 모든 보고서 가져 오기
GET
/ company / reports / {id} => "id"로 식별 된 보고서 정보 가져 오기
POST
/ company / reports => 새 보고서 작성
PUT
/ company / reports / {id} => 업데이트 "id"로 식별 된 보고서 정보
PATCH
/ company / reports / {id} => "id"로 식별 된 보고서 정보의 일부 업데이트
DELETE
/ company / reports / {id} => "id"로 보고서 삭제
POST와 PUT의 차이점은 PUT이 dem 등 적이라는 것입니다. 즉, 동일한 PUT 요청을 여러 번 호출하면 항상 동일한 결과가 발생하지만 (부작용이 아님), 반면 POST 요청을 반복해서 호출하면 ( 추가) 동일한 자원을 여러 번 작성하는 부작용.
GET
: GET을 사용하는 요청은 데이터 만 검색합니다. 즉, 지정된 자원의 표현을 요청합니다.
POST
: 서버로 데이터를 보내서 리소스를 만듭니다. 요청 본문의 유형은 Content-Type 헤더로 표시됩니다. 종종 서버의 상태 또는 부작용이 변경됩니다
PUT
: 새 자원을 작성하거나 대상 자원의 표현을 요청 페이로드로 바꿉니다.
PATCH
: 자원에 부분 수정을 적용하는 데 사용됩니다.
DELETE
: 지정된 리소스를 삭제합니다
TRACE
: 대상 리소스의 경로를 따라 메시지 루프백 테스트를 수행하여 유용한 디버깅 메커니즘을 제공합니다.
OPTIONS
: 대상 자원의 통신 옵션을 설명하는 데 사용되며 클라이언트는 OPTIONS 메소드의 URL을 지정하거나 전체 서버를 나타내는 별표 (*)를 지정할 수 있습니다.
HEAD
: GET 요청과 동일하지만 응답 본문이없는 응답을 요청합니다.
CONNECT
: 대상 리소스로 식별되는 서버에 터널을 설정하고 SSL (HTTPS)을 사용하는 웹 사이트에 액세스하는 데 사용할 수 있습니다
REST-ful 사용법
POST
새 리소스를 만든 다음 리소스를 반환하는 데 사용됩니다 URI
EX
REQUEST : POST ..../books
{
"book":"booName",
"author":"authorName"
}
이 전화는 새 책을 만들어 그 책을 반환 할 수 있습니다 URI
Response ...THE-NEW-RESOURCE-URI/books/5
PUT
리소스를 교체하는 데 사용됩니다. 해당 리소스가있는 경우 간단히 업데이트하지만 해당 리소스가없는 경우 리소스를 만들고
REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}
함께 PUT
우리 자원 ID를 알고 있지만, POST
새로운 리소스 식별자를 반환합니다
REST가 아닌 사용량
POST
서버 측에서 작업을 시작하는 데 사용됩니다.이 작업은 리소스를 생성하거나 생성하지 않을 수 있지만이 작업은 항상 서버에 무언가 변경 될 수있는 부작용이 있습니다.
PUT
특정 URL에 리터럴 컨텐츠를 배치하거나 바꾸는 데 사용됩니다.
REST-ful과 비 REST-ful 스타일의 또 다른 차이점
POST
비등 전성 작동 : 동일한 요청으로 여러 번 실행될 경우 일부 변경이 발생합니다.
PUT
Idempotent Operation : 동일한 요청으로 여러 번 실행될 경우 부작용이 없습니다.
POST
일반적인 CSRF (Cross-Site Request Forgery) 공격이 적용 되는 PUT
것은 아니지만 언급 할 가치가 있습니다 .
피해자가 방문 할 때는 아래 CSRF를 사용할 수 없습니다PUT
attackersite.com
.
공격의 효과는 것입니다 피해자가 실수로 사용자 삭제 그 (피해자가) 로그인에 한해서로 admin
에를 target.site.com
방문하기 전에 attackersite.com
:
일반 요청 (쿠키가 전송 됨) : ( PUT
지원되는 속성 값이 아님)
코드 attackersite.com
:
<form id="myform" method="post" action="http://target.site.com/deleteUser" >
<input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>
XHR 요청 (쿠키가 전송 됨) : ( PUT
프리 플라이트 요청을 트리거하여 브라우저에서 deleteUser
페이지 를 요청하지 못하게 함 )
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);
실제로 제목 외에는 차이가 없습니다. 실제로 GET과 다른 것 사이에는 기본적인 차이점이 있습니다. "GET"-Request 메소드를 사용하면 url-address-line으로 데이터를 보내며, 먼저 물음표로 구분되고 & 기호로 구분됩니다.
그러나 "POST"요청 방법을 사용하면 URL을 통해 데이터를 전달할 수 없지만 요청의 소위 "본문"에서 데이터를 개체로 전달해야합니다. 서버 측에서는 전송 된 데이터를 얻기 위해 수신 된 컨텐츠의 본문을 읽어야합니다. 그러나 다른 한편으로는 "GET"-요청을 보낼 때 본문에 내용을 보낼 가능성이 없습니다.
"GET"은 데이터를 가져 오기위한 것이며 "POST"는 데이터를 게시하기위한 것입니다. "GET"요청 또는 "POST"요청에 의해 전송 된 데이터를 기반으로 새 컨텐츠를 작성하거나 기존 컨텐츠를 삭제하거나 기존 컨텐츠를 편집하거나 백엔드에서 무엇이든 할 수 없습니다. "POST"-Request로 클라이언트가 데이터를 요청하는 방식으로 백엔드를 코딩하는 것을 막을 수있는 사람은 아무도 없습니다.
어떤 방법을 사용하든 요청에 따라 URL을 호출하고 지정할 데이터를 보내거나 보내지 않고 요청을 처리하기 위해 서버로 전달할 정보를 보낸 다음 클라이언트가 응답을받습니다. 서버. 데이터에는 보내려는 모든 것이 포함될 수 있으며 백엔드는 데이터로 원하는 모든 것을 할 수 있으며 응답에는 거기에 넣고 싶은 정보가 포함될 수 있습니다.
이 두 가지 기본 방법 만 있습니다. GET 및 POST. 그러나 그것은 그들의 구조이기 때문에 백엔드에서 코딩하는 것과 다르고 다릅니다. 백엔드에서는 수신 된 데이터를 사용하여 원하는 것을 코딩 할 수 있습니다. 그러나 "POST"-요청을 사용하면 url-addressline이 아닌 본문에서 데이터를 보내거나 검색해야하며 "GET"요청을 사용하면 url-addressline이 아닌 url-addressline에서 데이터를 보내거나 검색해야합니다. 몸. 그게 다야.
"PUT", "DELETE"등과 같은 다른 모든 메소드는 "POST"와 동일한 구조를 갖습니다.
url-addressline에 쓰는 내용이 캐시에 저장되고 GET-Method는 데이터로 url-addressline을 작성하는 것과 동일하기 때문에 내용을 다소 숨기려면 POST 방법이 주로 사용됩니다. 따라서 항상 사용자 이름 및 비밀번호가 아닌 민감한 데이터를 보내려면 url-address-line에 표시하지 않으려는 일부 ID 또는 해시와 같이 POST 메소드를 사용해야합니다 .
또한 URL- 주소 줄의 길이는 1024 기호로 제한되는 반면 "POST"-방법은 제한되지 않습니다. 따라서 더 많은 양의 데이터가있는 경우 GET-Request와 함께 보낼 수는 없지만 POST-Request를 사용해야합니다. 따라서 이것은 POST 요청의 또 다른 장점입니다.
그러나 복잡한 텍스트를 보내지 않으면 GET 요청을 처리하는 것이 훨씬 쉽습니다. 그렇지 않으면 POST 방법의 또 다른 장점은 GET 방법을 사용하면 텍스트 또는 공백 내에서 일부 기호를 보낼 수 있도록 텍스트를 URL 인코딩해야한다는 것입니다. 그러나 POST 방법을 사용하면 제한이 없으며 내용을 변경하거나 조작 할 필요가 없습니다.
PUT과 POST는 모두 Rest Methods입니다.
PUT-동일한 매개 변수를 두 번 사용하여 PUT을 사용하여 동일한 요청을 두 번하는 경우 두 번째 요청은 영향을 미치지 않습니다. 그렇기 때문에 PUT이 일반적으로 업데이트 시나리오에 사용되는 이유는 동일한 매개 변수로 Update를 두 번 이상 호출하면 초기 호출보다 더 많은 작업을 수행하지 않으므로 PUT이 dem 등원입니다.
POST는 idempotent가 아닙니다. 예를 들어 Create는 대상에 두 개의 개별 항목을 작성하므로 idempotent가 아니므로 CREATE는 POST에서 널리 사용됩니다.
매번 동일한 매개 변수로 POST를 사용하여 동일한 호출을 수행하면 두 가지 다른 상황이 발생하므로 POST가 작성 시나리오에 일반적으로 사용되는 이유