왜 HTTP를 얻고, 게시하고, 게시하는 것보다 더 필요한 것이 있습니까?

StackOverflow https://stackoverflow.com/questions/147187

  •  02-07-2019
  •  | 
  •  

문제

HTTP Get, Put, Delete, Post, Head를 사용하면 실질적인 이점은 무엇입니까? 자신의 행동 혜택 (안전 및 Idempotency)에 초점을 맞추고 이름을 잊고 원하는 행동에 따라 Get, Put, Post를 사용하십시오.

왜 우리는 Get, Put and Post (및 Drop Head, Delete) 만 사용해서는 안됩니까?

도움이 되었습니까?

해결책

REST] [1] 접근 방식은 웹 리소스의 CRUD 규칙을 구현하기 위해 Post, Get, Put 및 Delete를 사용합니다. 웹의 요청에 객체를 노출시키는 간단하고 깔끔한 방법입니다. 오버 헤드가없는 웹 서비스입니다.

의미 적 차이를 명확히하기 위해. 각 작업은 다소 다릅니다. 요점은 명확하고 뚜렷한 의미를 가진 멋진 HTTP 방법을 갖는 것입니다.

게시물은 새로운 객체를 만듭니다. URI에는 열쇠가 없습니다. 객체를 정의하는 메시지 본문을 수락합니다. SQL 삽입. [의 뜻편집하다 게시물이 열쇠가 없어야 할 기술적 인 이유는 없지만, 나머지 사람들은 게시물이 생성으로 뚜렷한 의미를 갖기 위해서는 열쇠가 없어야한다고 강력하게 제안합니다.

기존 개체를 검색하십시오. URI 5월 열쇠가 있으면 싱글 톤을 얻거나 목록을 작성하는지 여부에 따라 다릅니다. SQL 선택

기존 객체를 업데이트하십시오. URI에는 열쇠가 있습니다. 객체를 업데이트하는 메시지 본문을 수락합니다. SQL 업데이트.

기존 객체를 삭제합니다. URI에는 열쇠가 있습니다. SQL 삭제.

Put 대신 Post로 레코드를 업데이트 할 수 있습니까? 모호함을 소개하지 않고는 아닙니다. 동사는 명백한 영향을 미쳐야합니다. 또한 Post Uri는 열쇠가 없으며 Put은 열쇠가 있어야합니다.

게시하면 201가 생성 될 것으로 예상됩니다. 내가 그것을 얻지 못하면 뭔가 잘못되었습니다. 마찬가지로, 내가 넣을 때 나는 200 OK를 기대합니다. 내가 그것을 얻지 못하면 뭔가 잘못되었습니다.

나는 당신이 Post가 게시하거나 넣는 곳의 모호성을 주장 할 수 있다고 생각합니다. URI는 달라야합니다. 또한 관련 메시지가 다를 수 있습니다. 일반적으로 나머지 사람들은 삽입 및 업데이트가 다른 동사 인 SQL에서 신호를받습니다.

레코드가 존재하지 않으면 업데이트가 삽입 해야하는 경우를 만들거나 레코드가 존재하는 경우 업데이트 할 수 있습니다. 그러나 업데이트가 업데이트되고 업데이트에 실패하면 무언가 잘못된 것을 의미하는 경우 더 간단합니다. 삽입하는 비밀 낙하는 작업을 모호하게 만듭니다.

편안한 인터페이스를 구축하지 않는 경우 검색 및 작성/업데이트를 위해 Get and Post 만 사용하는 것이 일반적입니다. URI 차이 또는 메시지 내용 차이가있는 것이 일반적입니다. 게시물을 구별하여 사람이 양식에 제출을 클릭 할 때 게시물을 구별하는 것이 일반적입니다. 그러나 코드가 Post = CREATE CASE 또는 POST = 업데이트 케이스에 있는지 여부를 결정해야하기 때문에 매우 깨끗하지 않습니다.

다른 팁

게시하다 보장이 없습니다 안전 또는 Idempotency. 그것이 한 가지 이유입니다 놓다 그리고 삭제- Put and Delete는 모두 idempotent입니다 (예 : 1+N 동일 요청은 단지 1 요청과 동일한 최종 결과를 얻습니다).

놓다 사용됩니다 환경 주어진 URI의 자원 상태. 당신이 보낼 때 게시하다 특정 URI의 리소스 요청, 그 자원 해서는 안됩니다 ~이다 교체 내용에 의해. 최대는 있어야합니다 추가 에게. 이것이 Post가 idempotent가 아닌 이유입니다. 게시물이 추가되는 경우 모든 요청이 리소스에 추가됩니다 (예 : Post A 새로운 매번 토론 포럼에 메시지).

삭제 주어진 URI의 리소스가 서버에서 제거되도록하는 데 사용됩니다. 게시하다 일반적으로 경우를 제외하고 삭제에 사용해서는 안됩니다. 제출 삭제 요청. 다시 말하지만,이 경우 게시 할 리소스의 URI는 삭제하려는 리소스의 URI가되어서는 안됩니다. 게시 한 리소스는 게시 된 데이터를 수락하여 자체적으로 추가하거나 컬렉션에 추가하거나 다른 방식으로 처리하는 리소스입니다.

머리 당신이 관심있는 모든 것이 GET 요청의 헤더이며 실제 콘텐츠에서 대역폭을 낭비하고 싶지 않은 경우 사용됩니다. 이것은 가지고 있으면 좋습니다.

게시물보다 더 많은 것이 필요한 이유는 무엇입니까? 데이터는 두 가지 방식으로 흐를 수 있으므로 왜 필요한가? 대답은 기본적으로 귀하의 질문과 동일합니다. 다양한 방법의 기본 기대치를 표준화함으로써 다른 프로세스는 무엇을 해야하는지 더 잘 알 수 있습니다.

예를 들어, 캐싱 프록시를 개입하면 올바른 일을 할 가능성이 더 높을 수 있습니다.

예를 들어 머리에 대해 생각하십시오. 프록시 서버가 헤드가 무엇을 의미하는지 알고 있다면 이전 GET 요청에서 결과를 처리하여 헤드 요청에 대한 적절한 답변을 제공 할 수 있습니다. 또한 게시물, PIT 및 삭제가 캐시되어서는 안된다는 것을 알 수 있습니다.

아무도 내가 찾고 있던 대답의 종류를 게시하지 않았으므로 요점을 직접 요약하려고 노력할 것입니다.

"Restful Web Services"8 장 섹션 "오버로드 포스트"는 다음과 같이 읽습니다. 자원 지향 아키텍처이지만 덜 제한적인 휴식 규칙을 준수합니다. "

요컨대, POST에 유리한 PUT/DELETE 교체 API를 읽기가 더 어려워지고 통화를 삭제/삭제하면 더 이상 IDEMPONTENT가 아닙니다..

한마디로:

Idempotency

몇 마디로 :

get = safe + idempotent

put = idempotent

삭제 = idempotent

Post = 안전하거나 묘사되지 않습니다

'idempotent'는 단지 당신이 반복해서 할 수 있다는 것을 의미하며 항상 똑같은 일을 할 것입니다.

PUT (업데이트)를 재발행하거나 원하는만큼 요청을 삭제할 수 있으며 매번 동일한 효과를 얻을 수 있지만 원하는 효과는 리소스를 수정하여 '안전'으로 간주되지 않습니다.

사후 요청은 모든 요청마다 새 리소스를 생성해야합니다. 즉, 효과는 매번 다릅니다. 따라서 게시물은 안전하거나 Idemotent로 간주되지 않습니다.

Get and Head와 같은 방법은 단지 읽기 작업이므로 '안전한'것으로 간주됩니다.

이것은 HTTP 트랜잭션을 해석하는 표준/일관된 방법을 제공하기 때문에 실제로 매우 중요한 개념입니다. 이것은 보안 컨텍스트에서 특히 유용합니다.

모든 휴스터가 푸팅, 삭제를 지원하지는 않습니다.

나는 이상적인 세상에서 우리는 모든 동사를 가질 것이지만 .... :

편안한 웹 서비스 및 HTTP 동사

헤드는 주어진 서버의 시계가 설정된 내용을 결정하는 데 정말 유용합니다 (1 초 내에 정확하거나 네트워크 왕복 시간이 더 크다). Slashdot에서 Futurama 인용문을 얻는데도 좋습니다.

~$ curl -I slashdot.org
HTTP/1.1 200 OK
Date: Wed, 29 Oct 2008 05:35:13 GMT
Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005001227
X-FRY : 그것은 병아리 쇼입니다. 나는 장르의 프로그램을 선호합니다 : 세계에서 가장 빈 공백.
Cache-Control: private
Pragma: private
Connection: close
Content-Type: text/html; charset=iso-8859-1

을 위한 곱슬 곱슬하다, -I 헤드 요청을 수행하는 옵션입니다. 주어진 서버의 현재 날짜와 시간을 얻으려면

curl -I $server | grep ^Date

간단한 휴식 API의 더 나은/쉽게 재사용 할 수있는 모호성을 제한합니다.

당신은 가져 와서 게시 할 수 있지만, 당신은 가져 오는 것을 삭제하고 삭제하는 정밀도와 선명도를 잃고 있습니다. 게시물은 무엇이든 의미 할 수있는 와일드 카드 작업입니다. Put and Delete의 동작은 매우 잘 정의되어 있습니다. 리소스 관리 API를 생각하면 필요한 기능의 80% -90%를 포기하고 삭제하십시오. 자신이 제한하고 게시하도록 제한하면 제한적으로 지정된 게시물을 사용하여 API의 40% -60%에 액세스됩니다.

Get 및 Post를 사용하는 웹 응용 프로그램을 사용하면 사용자가 데이터를 작성,보기, 수정 및 삭제할 수 있지만 이러한 목적으로 원래 생성 된 HTTP 명령 위의 계층에서 수행 할 수 있습니다. REST의 배후에있는 아이디어 중 하나는 웹 디자인의 원래 의도로 돌아가서 각 CRUD 동사에 대한 특정 HTTP 작업이 있습니다.

또한 헤드 명령을 사용하여 파일 다운로드 (잠재적으로 큰) 파일 다운로드에 대한 사용자 경험을 향상시킬 수 있습니다. 응답이 얼마나 큰지 알아 내기 위해 Head에게 전화 한 다음 실제로 콘텐츠를 검색하도록 요청하십시오.

다음을 참조하십시오 링크 예시적인 예를 위해. 또한 여기서 아직 논의되지 않은 옵션 HTTP 방법을 사용하는 한 가지 방법을 제안합니다.

WebDAV와 같은 HTTP 확장 기능이 추가되어 기능적으로 추가로 필요합니다.

http://en.wikipedia.org/wiki/webdav

초기의 웹 서버 전쟁으로 인해 아마도 그 일이 일어 났을 것입니다.

~ 안에 1996 년에 작성된 HTTP 1.0, Get, Head 및 Post 만있었습니다.. 그러나 당신이 볼 수 있듯이 부록 d, 공급 업체는 자신의 물건을 추가하기 시작했습니다. 따라서 HTTP 호환을 유지하기 위해 그들은 1999 년 HTTP 1.1.

그러나 HTTP/1.0은 계층 적 프록시, 캐싱, 지속적인 연결의 필요성 또는 가상 호스트의 영향을 충분히 고려하지 않습니다. 또한, "HTTP/1.0"이라고 불리는 불완전한 구현 된 응용 프로그램의 확산은 두 개의 통신 응용 프로그램이 서로의 진정한 기능을 결정하기 위해 프로토콜 버전 변경이 필요했습니다.

이 사양은 "http/1.1"이라고하는 프로토콜을 정의합니다. 이 프로토콜에는 기능을 신뢰할 수있는 구현을 보장하기 위해 HTTP/1.0보다 더 엄격한 요구 사항이 포함되어 있습니다.

2 학년이 웹 페이지가 몇 가지 hoighty-toity 원칙으로 축소 될 수 있다고 생각했을 때, Get, Put, Delete 및 Post는 시대의 보류입니다.

오늘날 대부분의 웹 페이지는 이러한 원시 작업의 일부 또는 전부를 포함하는 복합 엔티티입니다. 예를 들어, 페이지에는 고객 정보를 보거나 업데이트하기위한 양식이있을 수 있으며, 아마도 여러 테이블에 걸쳐있을 수 있습니다.

나는 보통 PHP에서 $ _request []를 사용하며 정보가 어떻게 도착했는지를 돌보지 않습니다. 기본 (다중) 패러다임이 아닌 효율성을 기반으로 GET 또는 PILL 방법을 사용하도록 선택합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top