답변:
HTTP 동사는 아마도 HTTP 프로토콜에 대한 가장 비밀스러운 것들 중 하나 일 것입니다. 그것들이 존재하고 그들 중 많은 수가 있지만 왜 존재합니까?
Rails는 많은 동사를 지원하고 웹 브라우저에서 기본적으로 지원하지 않는 동사를 추가하려고합니다.
http 동사의 전체 목록은 다음과 같습니다. http://annevankesteren.nl/2007/10/http-methods
공식 RFC의 HTTP 패치는 다음과 같습니다. https://datatracker.ietf.org/doc/rfc5789/?include_text=1
패치 요청 엔티티에 기재된 사항의 세트는 요청 - URI에 의해 식별 된 자원에 적용되는 것이 요구 방법. 일련의 변경 사항은 미디어 유형으로 식별되는 "패치 문서"라는 형식으로 표시됩니다. 요청-URI가 기존 자원을 가리 키지 않는 경우, 서버는 수도 등 (논리적으로 널 자원을 수정할 수 있는지 여부) 패치 문서 유형에 따라 및 권한, 새로운 자원을 생성
PUT 요청 과 PATCH 요청 의 차이점 은 서버가 동봉 된 엔터티를 처리하여 Request-URI로 식별되는 리소스를 수정하는 방식에 반영됩니다. A의 PUT의 요청 동봉 엔티티 원 서버에 저장된 상기 자원의 수정 된 버전 인 것으로 간주되고, 클라이언트는 저장된 버전을 교환 할 것을 요구한다. 그러나 PATCH를 사용 하면 동봉 된 엔터티에 현재 원본 서버에있는 리소스를 수정하여 새 버전을 생성하는 방법을 설명하는 지침 세트가 포함됩니다. 패치 방법에 의해 식별 된 자원에 영향을 요청-URI를 , 또한 월다른 자원에 부작용이있다. 즉, 새로운 리소스는 PATCH 의 응용 프로그램에 의해 생성되거나 기존 리소스가 수정 될 수 있습니다 .
내가 아는 한, PATCH 동사는 레일 응용 프로그램에서와 같이 사용되지 않습니다 ... 이것을 이해하면 RFC 패치 동사를 사용하여 두 파일간에 diff를 수행 할 때와 같은 패치 명령을 보내야합니다. 전체 엔터티를 다시 보내는 대신 전체 엔터티를 다시 보내는 것보다 훨씬 작은 패치를 보냅니다.
거대한 파일을 편집하고 싶다고 상상해보십시오. 3 줄을 편집합니다. 파일을 다시 보내는 대신 diff를 보내면됩니다. 긍정적 인 측면에서 패치 요청 전송은 파일을 비동기 적으로 병합하는 데 사용될 수 있습니다. 버전 제어 시스템은 PATCH 동사를 사용하여 코드를 원격으로 업데이트 할 수 있습니다.
다른 유스 케이스는 NoSQL 데이터베이스와 다소 관련이 있으며 문서를 저장할 수 있습니다. 서버에서 클라이언트로 데이터를주고받는 데 JSON 구조를 사용한다고 가정하겠습니다. 필드를 삭제하려면 mongodb의 구문과 비슷한 구문을 $ unset 사용할 수 있습니다 . 실제로 mongodb에서 문서를 업데이트하는 데 사용되는 방법은 아마도 json 패치를 처리하는 데 사용될 수 있습니다.
이 예제를 보자 :
db.products.update(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
)
우리는 다음과 같은 것을 가질 수 있습니다 :
PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }
마지막으로, 사람들은 HTTP 동사에 대해 원하는 것을 말할 수 있습니다. 진실은 단 하나 뿐이며 RFC에는 진실이 있습니다.
Google에서 몇 시간을 보냈고 여기 에서 답을 찾았습니다 .
PUT => 사용자가 레코드의 일부 또는 전부를 업데이트 할 수있는 경우 PUT을 사용하십시오 (사용자는 업데이트 대상을 제어 함)
PUT /users/123/email
new.email@example.org
PATCH => 사용자가 부분 레코드 만 업데이트 할 수있는 경우 ( 예 : 이메일 주소 만 (응용 프로그램이 업데이트 할 수있는 항목을 제어)) PATCH를 사용하십시오.
PATCH /users/123
[description of changes]
왜 Patch
PUT
이 방법은 더 많은 대역폭이 필요하거나 부분적으로 전체 리소스를 처리합니다. 그래서 PATCH
대역폭을 줄이기 위해 도입되었다.
PATCH 에 대한 설명
PATCH
안전하지 않고 dem 등원이 아니며 다른 자원에 대한 전체 및 부분 업데이트 및 부작용을 허용하는 방법입니다.
PATCH
동봉 된 엔터티는 원본 서버에 현재 상주하는 리소스를 수정하여 새 버전을 생성하는 방법을 설명하는 일련의 지침을 포함하는 방법입니다.
PATCH /users/123
[
{ "op": "replace", "path": "/email", "value": "new.email@example.org" }
]
여기에 넣어 및 패치에 대한 자세한 내용은
PATCH
중 POST
, PUT
그것은 당신의 데이터를 수정하기 때문에 등을하는 것은, "안전"아니다 (부작용이있다). 부작용없이 엔드 포인트를 여러 번 호출 할 수있는 등 (안전한 방법) GET
과 비교합니다 OPTIONS
.
넣어
난 내 변경하려는 경우 first
다음 이름을 보내 넣어 업데이트에 대한 요청을
{ "first": "Nazmul", "last": "hasan" }
그러나 여기에서 문제가있다 put
내가 보낼 때 요청 put
요청을 내가 모두 두 개의 매개 변수를 전송해야 first
하고 last
다시 모든 값을 전송하는 필수 있도록
패치 :
patch
요청 말한다. data
원하는 것을 보내면 update
다른 데이터에 영향을 주거나 변경하지 않습니다.
따라서 모든 값을 다시 보낼 필요가 없습니다. 그냥 내 이름을 업데이트하고 싶기 때문에 업데이트 할 first
이름 만 보내면됩니다 .
HTTP 프로토콜의 POST, PUT 및 PATCH 메소드의 차이점은 다음과 같습니다.
게시하다
HTTP.POST 메소드는 항상 서버에서 새 자원을 작성합니다. 비등 전성 요청입니다. 즉, 사용자가 동일한 요청을 두 번 누르면 제한이없는 경우 다른 새 리소스가 만들어집니다.
http post 메소드는 데이터베이스에 항상 새 레코드를 작성하는 SQL의 INSERT 쿼리와 같습니다.
예 : POST 메소드를 사용하여 백엔드 서버가 새 자원의 자원 ID를 결정하는 새 사용자, 순서 등을 저장하십시오.
놓다
HTTP.PUT 메소드에서 자원은 먼저 URL에서 식별되며 존재하는 경우 갱신되며 그렇지 않으면 새 자원이 작성됩니다. 대상 리소스가 존재하면 해당 리소스를 완전히 새로운 본문으로 덮어 씁니다. 즉, HTTP.PUT 메서드는 리소스를 만들거나 업데이트하는 데 사용됩니다.
http put 메소드는 주어진 레코드가 존재하는지 여부에 따라 레코드를 삽입하거나 업데이트하는 SQL의 MERGE 쿼리와 같습니다.
PUT 요청은 dem 등적입니다. 즉, 동일한 요청을 두 번 두드리면 기존 레코딩이 업데이트됩니다 (새 레코드가 작성되지 않음). PUT 방법에서 리소스 ID는 클라이언트에 의해 결정되고 요청 URL에 제공됩니다.
예 : PUT 방법을 사용하여 기존 사용자 또는 주문을 업데이트하십시오.
반점
HTTP.PATCH 메소드는 델타 업데이트와 같은 자원의 부분 수정에 사용됩니다.
http 패치 방법은 전체 행이 아니라 선택한 열만 설정하거나 업데이트하는 SQL의 UPDATE 쿼리와 같습니다.
예 : PATCH 방법을 사용하여 주문 상태를 업데이트 할 수 있습니다.
패치 / api / users / 40450236 / order / 10234557
요청 본문 : {status : 'Delivered'}
HTTP 용어에 따르면 PUT
요청은 데이터베이스 업데이트 문과 같습니다.
PUT
-기존 리소스를 수정하는 데 사용됩니다 (이전 POSTED). 반면에 PATCH
요청은 기존 리소스의 일부를 업데이트하는 데 사용됩니다.
예를 들어 :
고객의 세부 사항:
// This is just a example.
firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..
우리는 전체 기록으로 업데이트하고 싶습니까? 우리는 그것을 위해 사용해야 Http
PUT
verb
합니다.
같은 :
// Customer Details Updated.
firstName = "James++++";
lastName = "Anderson++++";
email = "email@Updated.com";
phoneNumber = "+92 0987654321";
//..
반면에 전체 레코드가 아닌 레코드의 일부만 업데이트하려면 계속 진행하십시오 Http
PATCH
verb
.
같은 :
// Only Customer firstName and lastName is Updated.
firstName = "Updated FirstName";
lastName = "Updated LastName";
//..
PUT vs POST :
PUT
요청을 사용할 때 firstName, lastName, email, phoneNumber와 같은 모든 매개 변수를 보내야합니다. patch
요청에서 업데이트하려는 매개 변수 만 보내면 다른 데이터에 영향을 주거나 변경하지 않습니다.
자세한 내용은 https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/ 를 참조하십시오.