HTTP 프로토콜에서 GET 및 POST와 같은 메소드가 필요합니까?


17

요청 본문과 응답 본문 만 사용하여 HTTP 프로토콜을 구현할 수 없습니까?

예를 들어, URL에는 요청이 포함되며, 요청은 서버 측의 프로그래밍 언어에 따라 서블릿과 같은 함수에 매핑되며 응답으로 HTML 및 JavaScript 응답이 전송됩니다.

왜 HTTP 프로토콜에 메소드 개념이 있습니까?

대답에서 나는 왜 방법의 개념이 존재하는지에 대한 감각을 얻습니다. 이것은 또 다른 관련 질문으로 이어집니다.

예를 들어 Gmail 편지 쓰기 링크에서 PUT / POST 요청 및 데이터가 전송됩니다. 브라우저는 어떤 방법을 사용해야합니까? 서버에서 보낸 Gmail 페이지에 Gmail 작성 요청을 호출 할 때 사용할 메소드 이름이 포함되어 있습니까? www.gmail.com을 호출 할 때 GET 메소드를 사용해야합니다. 브라우저가이 메소드를 사용한다는 것을 어떻게 알 수 있습니까?

추신 : 답변에 대한 의견이 충분하지 않으므로이 질문의 의도와 관련된 사람들이 제기 한 많은 질문에 대해서는 언급 할 수 없습니다.

일부 답변에서 알 수 있듯이 DELETE 메소드에서 새 사용자를 만들 수 있습니다. 그러면 하루가 지나면 서버에 따라 URL을 매핑하려는 함수에 따라 달라지기 때문에 http 프로토콜에서 메소드 개념에 대한 의도를 묻습니다. . 클라이언트가 URL에 사용할 메소드를 서버에 알려 주어야하는 이유


예, 아니오 HTTP를 사용하지 않고 HTTP 요청을하는 방법을 알고 싶다고 말하면 귀하의 질문 자체와 충돌하지만 귀하가하려고하는 것을 얻습니다. 즉, 브라우저를 사용하지 않고 프로그래밍 방식으로 데이터를 가져옵니다. 그 맞습니까?
Rob

4
HTTP를 메소드없이 정의 할 수 있는지, 즉 그에 대한 역사적 근거를 묻고 있는지 궁금합니다. 또는 현재의 프로토콜이 그것들없이 사용될 수 있다면, 즉, 삭제 방법이 기존의 사양 내에 있을까요?
ilkkachu

@ilkkachu : 클라이언트가 서버에게 무언가를 실행하는 방법을 알려 주어야하는 이유는 무엇입니까? 클라이언트는 URL 만 요청하고 URL을 사용합니다. 예를 들어 서버는이를 서블릿이라고하는 함수에 맵핑하고 응답을 제공 할 수 있습니다. 클라이언트가 무언가를 실행하는 방법을 제공해야하는 이유는 무엇입니까?
user104656

1
@ user104656, 그것이 내 질문에 대한 답변이라면 여전히 원래 디자인인지 또는 현재 상황인지 확실하지 않습니다. (필요하거나 필요하지 않다고 말하지는 않았습니다.)
ilkkachu

@Mars and Others : 예를 들어 Gmail 편지 쓰기 링크에서 PUT / POST 요청 및 데이터가 전송됩니다. 브라우저는 어떤 방법을 사용해야합니까? 서버에서 보낸 Gmail 페이지에 Gmail 작성 요청을 호출 할 때 사용할 메소드 이름이 포함되어 있습니까? www.gmail.com을 호출 할 때 GET 메소드를 사용해야합니다. 브라우저가이 메소드를 사용한다는 것을 어떻게 알 수 있습니까?
BioLogic

답변:


33

유의하시기 바랍니다 질문 / 변경이 답변이 처음 기록 된 이후 명확하게되었다. 질문의 최신 반복에 대한 추가 응답은 두 번째 수평 규칙 이후입니다.

HTTP 프로토콜에서 GET 및 POST와 같은 메소드가 필요합니까?

헤더 형식과 같은 몇 가지 다른 것들과 함께 헤더와 본문이 분리되는 방법에 대한 규칙이 HTTP 프로토콜의 기초를 형성합니다.

요청 본문과 응답 본문 만 사용하여 HTTP 프로토콜을 구현할 수 없습니까?

아니요, 생성 한 것은 HTTP 프로토콜이 아니기 때문에

예를 들어, URL에는 요청이 포함되며, 요청은 서버 측의 프로그래밍 언어에 따라 서블릿과 같은 함수에 매핑되며 응답으로 HTML 및 JavaScript 응답이 전송됩니다.

축하합니다. 방금 새로운 프로토콜을 발명했습니다! 이제 표준 본문을 설정하여 구동 및 유지 관리하고 개발하는 등의 작업을 수행하면 언젠가 HTTP를 능가 할 수 있습니다.

나는 이것이 뺨에 약간의 혀이지만, 인터넷, TCP / IP 또는 서버와 클라이언트 사이에서 진행되는 통신에 대해서는 마술이 아닙니다. 연결을 열고 단어를 아래로 보내 대화를 형성합니다. 요청을 이해하고 현명한 응답을 전달하려면 대화가 양측 비준 사양을 준수해야합니다. 이것은 세상의 대화와 다르지 않습니다. 당신은 영어를하고, 이웃은 중국어를합니다. 바라건대 손을 흔들고 주먹을 흔드는 것만으로도 집 앞에 차를 주차하고 싶지 않다는 메시지를 전달할 수있을 것입니다.

HTTP를 준수하는 웹 서버에 대한 소켓을 열고 다음을 전송하면 인터넷으로 돌아갑니다.

EHLO
AUTH LOGIN

(SMTP 이메일 전송의 시작) 그러면 합리적인 답변을 얻을 수 없습니다. 가장 완벽한 SMTP 호환 클라이언트를 만들 수는 있지만이 대화는 공유 프로토콜, 기쁨, 공유 프로토콜에 관한 것이기 때문에 웹 서버와 대화 할 수 없습니다.

그렇기 때문에 HTTP 프로토콜을 구현하지 않고는 HTTP 프로토콜을 구현할 수 없습니다. 작성한 내용이 프로토콜과 일치하지 않으면 단순히 프로토콜이 아니며 다른 것이므로 프로토콜에 지정된대로 작동하지 않습니다.

우리가 잠시 당신의 모범으로 달려 간다면; 클라이언트는 URL처럼 보이는 것을 연결하고 설명 만합니다. 그리고 서버는 그것을 이해하고 HTML / JS (웹 페이지)처럼 보이는 것을 전송합니다. 그래도 무엇을 구했습니까? GET을 말하지 않는 몇 바이트? 그 성가신 헤더를 버리는 것에 대한 몇 가지 더. 서버도 일부를 저장했습니다-그러나 당신이 보낸 것을 해결할 수 없다면 어떻게해야합니까? JPEG로 끝나는 URL을 요청하고 그림을 만드는 바이트를 보냈지 만 PNG로되어 있으면 어떻게해야합니까? 불완전한 PNG. 우리가 가고있는 바이트 수를 말한 헤더가 있다면우리가 수신 한 바이트 수가 실제로 전체 파일인지 아닌지를 알 수 있습니다. 서버가 대역폭을 절약하기 위해 응답을 zip으로 표시했지만 알려주지 않으면 어떻게됩니까? 전송 한 내용을 해결하기 위해 상당한 컴퓨팅 성능을 사용하게됩니다.

하루가 끝나면 메타 정보 가 필요합니다 -정보에 대한 정보; 헤더가 필요합니다. 이름, 확장자, 생성 날짜를 가진 파일이 필요합니다. 우리는 사람들에게 생일을 보내고, 감사하고 감사를 표해야합니다. 세상은 상황에 대한 프로토콜과 정보로 가득 차 있기 때문에 항상 앉아서 처음부터 모든 것을 해결할 필요가 없습니다. 약간의 저장 공간이 필요하지만 쉽게 가치가 있습니다.


다양한 HTTP 메소드를 구현해야합니까?

논란의 여지없이, 지정된 전체 프로토콜을 구현할 필요는 없으며 일반적으로 모든 경우에 해당됩니다. 나는 영어로 모든 단어를 모른다; 저의 중국인 이웃은 또한 소프트웨어 개발자이지만 다른 산업에 종사하고 있으며 영어뿐만 아니라 제 산업에서 사용되는 일부 용어에 대해 중국어조차 알지 못합니다. 그러나 좋은 점은 HTTP 구현에 대한 문서를 가져 와서 서버를 작성할 수 있고 다른 아키텍처의 다른 프로그래밍 언어로 클라이언트를 작성할 수 있으며 프로토콜을 준수하기 때문에 여전히 작동한다는 것입니다

사용자 중 어느 누구도 GET 요청 이외의 다른 것을 발행하거나 영구적 인 연결을 사용하지 않거나 JSON 이외의 다른 것을 본문으로 보내거나 텍스트 / 일반 이외의 다른 것을 허용하지 않는 경우가있을 수 있습니다. 클라이언트 브라우저의 매우 제한된 요구 사항 만 충족시키는 웹 서버를 작성하십시오. 그러나 HTTP가 무엇인지 "일부 텍스트를 소켓으로 전달하는"기본 규칙을 무시하기로 마음대로 결정할 수는 없었습니다. 요청이 다음과 같은 문자열이라는 기본 개념을 버릴 수 없습니다.

VERB URL VERSION
header: value

maybe_body

응답에는 버전과 상태 코드 및 헤더가 있습니다. 그것 중 하나를 변경하면-그것은 더 이상 HTTP가 아닙니다-그것은 다른 것이고, 그것을 이해하도록 설계된 것으로 만 작동합니다. HTTP는 이러한 정의에 따른 것이므로이를 구현하려면 정의를 따라야합니다.


최신 정보

귀하의 질문은 약간 발전했습니다. 다음은 귀하가 요청한 것에 대한 답변입니다.

왜 HTTP 프로토콜에 메소드 개념이 있습니까?

역사적으로, 스크립팅이 존재하지 않았거나 페이지가 동적 일 수 있고 메모리에서 즉시 생성되어 대신 소켓을 아래로 밀어 넣을 수 있다는 개념까지도 설계 및 구현에있어 훨씬 융통성이 없다는 것을 알아야합니다. 클라이언트가 요청하고 소켓을 읽고 푸시 다운 한 디스크의 정적 파일이 존재하지 않습니다. 초창기 웹은 다른 페이지에 대한 링크를 포함하는 정적 페이지 개념을 중심으로 했으므로 모든 페이지는 디스크에 존재하고 탐색은 터미널에서 주로 URL의 페이지에 대한 GET 요청을 수행했을 것입니다. 디스크의 파일에 대한 URL을 보내십시오. 서로 연결되어 있고 다른 곳으로 연결된 문서의 웹은 진화해야한다는 개념도있었습니다.

URL은 유연하지 않은 비트였으며 디스크상의 페이지를 간단하게 참조하기 때문에 메소드에 대한 역사적인 컨텍스트를 제공하므로 클라이언트가 파일 및 서버에 대한 의도를 설명 할 수 있기 때문에이 메소드가 유용했습니다. 다양한 방법으로 방법을 처리하십시오. 하이퍼 텍스트 (그리고 실제로는 텍스트 만) 웹의 원래 비전에서 실제로 URL이 가상이라는 개념이나 전환 또는 매핑에 사용되는 개념은 없었습니다.

나는이 답변이 날짜와 날짜가 바뀌기 시작한 시점에 대한 참조가 기록 된 역사적인 기록을 문서화하려는 의도는 아닙니다 .Wikipedia를 읽을 수 있기 때문에 시간이 지남에 따라 더 많은 모멘텀을 제공하고 서버-클라이언트 연결의 각 끝에서 우리가 확장하고있는 풍부한 멀티미디어 경험을 만들 수있는 기회. 브라우저는 컨텐츠를 포맷하기위한 태그의 엄청난 확산을 지원했으며, 각각은 필수 미디어 풍부 기능을 구현하기 위해 경주하고 사물을 멋지게 만드는 새로운 방법을 지원했습니다.

스크립팅은 클라이언트 측과 플러그인 및 브라우저 확장 프로그램에 도착했으며, 브라우저는 모든 기능을 갖춘 강력한 도구로 만들었습니다. 서버 측에서 알고리즘 또는 데이터베이스 데이터를 기반으로 한 능동적 인 컨텐츠 생성은 큰 추진력이었으며 더 이상 디스크에 파일이 거의 없을 정도로 계속 발전하고 있습니다. 물론 그림이나 스크립트 파일을 파일로 유지합니다. 웹 서버에 브라우저를 설치하십시오. 그러나 점점 브라우저에 표시되는 그림과 해당 스크립트가 실행되는 스크립트는 파일 탐색기에서 열 수있는 파일이 아니라 필요에 따라 일부 컴파일 프로세스의 출력 인 컨텐츠를 생성합니다. , SVG는 픽셀의 비트 맵 배열이 아닌 픽셀을 그리는 방법을 설명하거나 TypeScript와 같은 상위 수준의 스크립트에서 생성 된 JavaScript를 설명합니다.

현대의 멀티 메가 바이트 페이지를 만들면 아마도 그 일부만 디스크에 고정 된 내용 일 것입니다. 데이터베이스 데이터는 브라우저가 사용할 HTML 형식으로 형식이 지정되며 여러 가지 프로그래밍 루틴이 URL에 의해 참조되는 방식에 따라 서버에서 수행됩니다.

나는 질문에 대한 의견에서 그것이 완전한 원과 비슷하다고 언급했다. 컴퓨터 비용이 수십만 대에 달하고 방이 가득 찼을 때 여러 사용자가 수백 개의 바보 같은 터미널을 통해 하나의 강력한 중앙 메인 프레임을 사용할 수있게하는 것이 일반적이었습니다. 키보드와 마우스, 녹색 화면, 텍스트 보내기, 일부 가져 오기 텍스트 아웃. 컴퓨팅 성능이 향상되고 가격이 하락함에 따라 사람들은 초기 메인 프레임보다 강력한 데스크탑 컴퓨터와 강력한 앱을 로컬에서 실행할 수있는 기능을 갖추기 시작하여 메인 프레임 모델이 구식이되었습니다. 다른 방식으로 전환하고 유용한 앱 기능을 대부분 제공하는 중앙 서버로 돌아가고 화면에 그리는 것 외에는 거의 수행하지 않는 수백 대의 클라이언트 컴퓨터로 되돌아 가기 때문에 결코 사라지지 않았습니다. 서버와 데이터를주고받습니다. 컴퓨터가 자신의 단어 사본과 전망을 동시에 실행할 수있을 정도로 똑똑한 그 기간은 다시 온라인으로 사무실로 향하게되었습니다. 브라우저는 화면에 그림을 그리고 문서 / 이메일을 편집하는 장치입니다. 브라우저는 서버에 존재하는 것으로 작성되고, 저장되어 다른 사용자와 공유되고 브라우저는 다른 곳에 사는이 것의 어느 시점에서든 부분적으로 볼 수있는 쉘이라는 개념으로 다른 사용자와 공유 및 공유합니다

대답에서 나는 왜 방법의 개념이 존재하는지에 대한 감각을 얻습니다. 이것은 또 다른 관련 질문으로 이어집니다.

예를 들어 Gmail 편지 쓰기 링크에서 PUT / POST 요청 및 데이터가 전송됩니다. 브라우저는 어떤 방법을 사용해야합니까?

URL을 입력하고 return 키를 누를 때 발생하는 것으로 결정되므로 기본적으로 GET을 사용합니다.

서버에서 보낸 Gmail 페이지에 Gmail 작성 요청을 호출 할 때 사용할 메소드 이름이 포함되어 있습니까?

이것은 위의 의견에서 언급 한 핵심 사항 중 하나입니다. 현대 웹에서는 더 이상 페이지에 관한 것이 아닙니다. 일단 페이지가 디스크에있는 파일이면 브라우저는 GET 할 것입니다. 그런 다음 데이터를 템플릿으로 슬롯을 지정하여 주로 동적으로 생성되는 페이지가되었습니다. 그러나 여전히 "서버에서 새 페이지 요청, 페이지 가져 오기, 페이지 표시"프로세스가 필요했습니다. 페이지 스와핑이 정말 매끄 럽습니다. 당신은 그들이로드하고 크기를 조정하고 주위의 레이아웃을 저크하여 매끄럽게 느꼈지만 여전히 전체 페이지 또는 페이지의 일부를 다른 페이지로 대체하는 브라우저였습니다

최신 작업 방식은 단일 페이지 응용 프로그램입니다. 브라우저에는 메모리에 문서가있어 특정 방식으로 표시되며 bservr를 스크립팅하고 정보를 다시 가져오고 페이지의 일부가 시각적으로 변경되어 새로운 정보를 표시하도록 문서를 조작합니다. 브라우저가 다른 새 페이지를로드합니다. 그것은 단지 단어 나 전망과 같은 전형적인 클라이언트 앱처럼 일부가 업데이트되는 UI가되었습니다. 새로운 요소는 다른 요소 위에 나타나며 대화 창 시뮬레이션 등으로 드래그 할 수 있습니다.이 모든 것은 개발자가 원하는 http 메소드를 사용하여 요청을 전송하고, 데이터를 가져오고 브라우저가 그리는 문서를 파킹하는 브라우저 스크립팅 엔진입니다. 최신 브라우저는 전체 운영 체제 또는 가상 컴퓨터와 같은 훌륭한 장치라고 생각할 수 있습니다. 화면에 물건을 그리기, 소리 재생, 사용자 입력 캡처 및 처리를 위해 전송하는 상당히 표준화 된 프로그래밍 가능 장치 UI를 그리려면 UI를 만드는 html / css를 제공 한 다음 HTML을 지속적으로 조정하여 브라우저가 그리는 내용을 변경하도록하십시오. 도대체 사람들은 주소 표시 줄이 변경되는 것을 보거나 / 탐색 (완전히 새로운 페이지를 요구하는)이 수행되지 않아도 단일 페이지 앱이 프로그래밍 방식으로 URL을 변경하려는 의도의 방향으로 사용하는 데 익숙합니다. UI를 그리려면 UI를 만드는 html / css를 제공 한 다음 HTML을 지속적으로 조정하여 브라우저가 그리는 내용을 변경하도록하십시오. 도대체 사람들은 주소 표시 줄이 변경되는 것을 보거나 / 탐색 (완전히 새로운 페이지를 요구하는)이 수행되지 않아도 단일 페이지 앱이 프로그래밍 방식으로 URL을 변경하려는 의도의 방향으로 사용하는 데 익숙합니다. UI를 그리려면 UI를 만드는 html / css를 제공 한 다음 HTML을 지속적으로 조정하여 브라우저가 그리는 내용을 변경하도록하십시오. 도대체 사람들은 주소 표시 줄이 변경되는 것을 보거나 / 탐색 (완전히 새로운 페이지를 요구하는)이 수행되지 않아도 단일 페이지 앱이 프로그래밍 방식으로 URL을 변경하려는 의도의 방향으로 사용하는 데 익숙합니다.

www.gmail.com을 호출 할 때 GET 메소드를 사용해야합니다. 브라우저가이 메소드를 사용한다는 것을 어떻게 알 수 있습니까?

진실. 지정 되었기 때문입니다. 첫 번째 요청은 역사적으로 항상 UI를 그리기 위해 일부 초기 HTML을 얻은 다음 영원히 찌르고 조작하거나 다른 스크립트를 사용하여 펑크 및 조작 반응 형 반응 형 UI를 만드는 다른 페이지를 얻는 것입니다.

일부 답변에서 알 수 있듯이 DELETE 메소드에서 새 사용자를 만들 수 있습니다. 그러면 하루가 지나면 서버에 따라 URL을 매핑하려는 함수에 따라 달라지기 때문에 http 프로토콜에서 메소드 개념에 대한 의도를 묻습니다. . 클라이언트가 URL에 사용할 메소드를 서버에 알려 주어야하는 이유

역사. 유산. 우리는 이론적으로 모든 http 메소드를 내일 밖으로 던질 수 있습니다-우리는 URL을 처리 할 수있는 한도까지 URL을 처리 할 수 ​​있기 때문에 메소드가 쓸모없는 프로그래밍 정교화 수준에 있습니다. 서버에 / emails / draft / save / 1234 파일이없는 경우-서버가 해당 URL을 따로 선택하고 본문 데이터 저장과 관련하여 수행 할 작업을 알도록 프로그램되어 있습니다. 아이디 1234의 임시 이메일로

따라서 그 주위에서 자란 거대한 레거시 호환성을 제외하고는 메소드를 제거하는 것이 가능합니다. 필요한 것을 위해 사용하는 것이 좋지만 대부분 무시하고 대신 작동하는 데 필요한 것을 사용하는 것이 좋습니다. 우리는 우리가 앱을 만든 브라우저와 서버에 무언가를 의미한다는 것을 기억해야하기 때문에 여전히 간결한 방법이 필요합니다. 클라이언트 측 스크립트는 기본 브라우저를 사용하여 데이터를 보내려고합니다 .GET은 변수 정보를 모두 URL에 압축하고 길이에 제한이 있기 때문에 POST와 같이 브라우저가 요청하는 방식을 사용해야합니다. 많은 서버에서. 클라이언트는 서버에서 긴 응답을 원합니다. 응답 본문이 없어야하므로 HEAD를 사용하지 마십시오.


1
나는 "당신이 쓴 것이 프로토콜에 맞지 않는다면 그것은 단순히 프로토콜이 아니다"에서 플래시백을 얻었습니다. "집 규칙"이 있다고 말하면 거세 지거나 전당포 폰 캡처없이 체스를 할 수 있습니다. 나는 "흥미로운 게임이지만 그런 규칙이 없다면 '체스'가 아니다"와 같은 것을 말했다. 게임 규칙을 바꾸면 더 이상 같은 게임이 아닙니다.
Monty Harder

4
메소드 또는 헤더가없는 현재 HTTP가 아닌 방법에 대한 서클을 작성했지만 (질문은 헤더에 대해서는 실제로 아무 것도 말하지 않았지만) 메소드가 무엇인지, 프로토콜이 메소드없이 동일한 목적으로 작동하는지 여부는 결코 말하지 않습니다. —이 질문에 관한 것입니다.
aaa

1
왜 "방법"이 무엇인지 말해야합니까? 이에 대한 사양 문서가 있습니다. HTTP는 마술이 아니며 FTP 또는 SMTP 또는 RTMP도 아닙니다. 모두 소켓으로 내려가는 바이트 일뿐입니다. 순서, 표현, 바이트가 준수하는 규칙 (프로토콜)은 프로토콜을 프로토콜로 만듭니다. 입니다. 내가하지 않은 질문에서 무언가를 읽었지만 질문에 대답 하지 않아도됩니다. 방법없이 프로토콜을 만들 수 있습니까? -실제로는 아니지만 방법의 의미에 달려 있습니다. HTTP는 HTTP 방법과 프로토콜 만하지만, 모든 프로토콜은 내가 가지고 .. 생각할 수
카이 우스 JARD

.. 방법이라고 부르는 규정 된 상호 작용 패턴; 그들 없이는 프로토콜이 아니며 안정적인 프로세스 간 / 시스템 간 통신을 달성 할 수 없습니다.
Caius Jard

실제로, 나는 그 방법이 무엇을위한 것인지를 설명하는 스펙 문서가 있다고 말했다. 메소드는 "for"일 필요는 없습니다. GET에 응답하여 항목을 삭제하고 DELETE에 응답하여 새 사용자를 작성하는 웹 서비스를 작성할 수 있습니다. 메소드에는 필수 동작이 없으며, 지정 되었기 때문에 존재합니다. 시스템은 많은 노력을 없애기 때문에 프로토콜 위에 구축됩니다 (프로토콜을 사용하는 시스템뿐만 아니라 프로토콜을 발명 할 필요가 없습니다).하지만 양측을 제어 할 때 프로토콜의 어떤 측면이 사용됩니까 for)는 꽤 임의적입니다
Caius Jard

12

HTTP는 원격 프로 시저 호출의 일반적인 원칙 중 하나의 특정 사례로 생각할 수 있습니다. 요청의 일부 변수 필드로 서버에 원하는 것을 알려 주면 서버가 이에 응답합니다. 이제 'Web 2.0'의 복잡한 상호 작용으로 인해 URL, 헤더, 본문 및 각 응용 프로그램 서버 및 응용 프로그램은 요청의 모든 필드에 동일한 기능이 적용됩니다. 그러나 원래 웹은 더 단순하고 정적 페이지를 사용했으며 HTTP 메소드가 충분한 상호 작용 수준을 제공한다고 생각했습니다. 특히 HTTP에는 거의 사용되지 않는 많은 메소드가 있으며, 그중 일부는 REST 덕분에 빛을 볼 수 있습니다. 예를 들어, PUT과 DELETE는 REST 이전에 빈사였으며, TRACE와 PATCH는 여전히 보이지 않습니다. 테이크 아웃은 HTTP의 RPC 모델이

REST는 PUT 및 DELETE가 다시 사용되는 경우 HTTP 메소드가 대부분의 앱의 일반적인 CRUD 사용 사례를 제공한다는 점을 지적함으로써 제안하는 것과 정확히 반대입니다.

HTTP 메소드에는 시맨틱이 할당되어 있으며 프록시 서버와 같은 브라우저 및 미들웨어에서 사용합니다. POST, PUT, DELETE 및 PATCH 요청은 부작용이 있으며 dem 등성이 아닐 수 있으므로 클라이언트 측 앱 및 미들웨어는주의해야합니다. 사용자의 명시적인 조치없이 이러한 요청을 발생시키지 않습니다. 실제로 제대로 디자인되지 않은 웹 앱은 안전하지 않은 작업에 GET을 사용했습니다. 예를 들어 Google Web Accelerator 프리 페처는 이러한 사이트 에서 많은 데이터를 삭제하여 문제를 일으켰 으므로 출시 직후 베타 버전이 중단되었습니다.

따라서 '우리가 할 수있는'질문에 대답하려면 : 확실하게 서버 응용 프로그램에 수행하려는 작업을 알려주는 프로토콜에 동의하면됩니다. 액션의 대상 아이템. 일련의 작업은 특정 앱에 의해서만 제한되므로 확장 가능한 프로토콜이 필요합니다. 그러나 어떤 요청이 안전한지 클라이언트 앱에 알려주고 캐시 제어와 같은 다른 뉘앙스를 고려해야 할 수도 있습니다.


4
"PUT과 DELETE는 REST 이전의 빈사였습니다"사실이 아닙니다. WebDAV는 어떻게 작동했다고 생각하십니까?
Patrick Mevzek

3
그래 @PatrickMevzek하지만 WebDAV를 혼수 상태에 살아보다는 고려 충분한 사람들에 의해 사용되었다 ^^?
프랭크 홉킨스

1
@PatrickMevzek WebDAV는 실질적으로 HTTP와 별개의 프로토콜입니다.
duskwuff

@duskwuff tools.ietf.org/html/rfc4918 "WebDAV (Web Distributed Authoring and Versioning)를위한 HTTP 확장". 그렇게 별개가 아니라 분명히 그 위에 있습니다.
Patrick Mevzek

1
PATCH는 REST에서 부분 변경 (일명 업데이트)을 나타 내기 위해 사용합니다.
jmoreno

7

필자의 개인적인 관점에서 개발자는 API 엔드 포인트를 훨씬 쉽게 만들 수 있습니다. 예를 들어 웹 사이트에서 제품을 관리하는 컨트롤러를 작성하면 동일한 URL을 사용하여 여러 가지 다른 작업을 수행 할 수 있습니다.

예 :

GET https://example.com/api/products/1234

제품 1234의 세부 사항을 가져옵니다.


POST https://example.com/api/products/1234

요청 본문의 데이터를 사용하여 ID가 ​​1234 인 제품이 생성됩니다.


PUT https://example.com/api/products/1234

요청 본문의 데이터로 제품 1234가 업데이트됩니다.


DELETE https://example.com/api/products/1234

ID가 1234 인 제품이 삭제됩니다.


각 작업마다 다른 종점을 만들 수 있지만 프로세스가 복잡해지고 다른 개발자에게는 이해하기 어려워집니다.


1
이것은 다른 사람들처럼 정확한 질문에 완전히 대답하지는 않지만 개별 방법을 계속 사용하는 현대적인 근거입니다. +1
TCooper

6

HTTP 프로토콜에서 GET 및 POST와 같은 메소드가 필요합니까?

HTTP 서버가 파일 을 제공하기 위해 존재했던 시절을 잊어 버린 것 같습니다 . 스크립트, CGI를 실행하거나 그러한 종류의 동적 컨텐츠를 작성하지 않습니다.

요청 방법은 기본적인 표준화 에 동사의 세트 무엇을해야하는지 그 파일을 ...

  • GET은 다운로드를 의미합니다
  • HEAD는 정보를 얻는 것을 의미합니다
  • PUT은 업로드를 의미합니다
  • 삭제는 제거를 의미 합니다.
  • POST는 데이터를
  • 옵션은 내가 뭘 할 수 있는지 말해줘

HTTP / 0.9의 시대에 요청 라인은 프로토콜의 요청 다리에서 유일하게; 요청 헤더, 응답 헤더가 없습니다. 을 입력 하고을 누르면 서버가 응답 본문 (예 : HTML 내용)을 반환합니다. 감사합니다. 연결을 닫으십시오.GET /somefileEnter

당신이 물어 단지 의미하는 경우 그 이유 가 이런 식으로 디자인되었다 ? 내 대답은 원래 당시 의 콘텐츠 교환 , 즉 사용자 요청에 따라 정적 HTML 파일 제공 을 처리하기 위해 작성 되었기 때문 입니다.

그러나 최신 응용 프로그램 서버에서 이러한 의미를 처리하는 방법에 대해 문의하려는 경우 ...

요청 본문과 응답 본문 만 사용하여 HTTP 프로토콜을 구현할 수 없습니까?

다양한 HTTP 메소드를 구현해야합니까?

내 대답은 : 당신이 좋아,하지만 당신은 것을 명심 것이 무엇 이건 하는 방식으로 애플리케이션 로직을 구현하는 프로토콜의 무시 기대 : 매우 느슨하게 데이터 (또는 변경해서는 안 GET 같은 기대는, 적어도이 나무 등의 결과 ), HEAD는 GET과 동일한 결과를 가져야하지만 응답 본문이 없으면 PUT은 대상 URI의 컨텐츠를 사용 가능하게해야합니다 (성공한 경우).

그 의미를 신중하게 고려하지 않고 기대에 부딪 치면 다양한 불쾌한 일이 발생할 수 있습니다.

  • 데이터 제출 사용에 GET 메소드를 추가 할 때 서버가 얼굴에 414 " URI Too Long "오류를 뱉을 수 있습니다 .
  • 데이터 수정 사용에 GET 메소드를 추가하면 사용자가 캐싱 프록시 뒤에있을 때 수정이 이루어지지 않거나 책갈피에서 URL을 리콜 (또는 웹 크롤러가 도달 할 때) 할 때 예기치 않은 수정이 발생할 수 있습니다. .
  • HEAD 방법에 부적절하게 응답하면 사이트에서 자동 사이트 확인 도구 (예 wget --spider:)가 구제되는 것을 알 수 있습니다.
  • POST 방법을 컨텐츠 다운로드에 삽입하면 북마크 또는 브라우저에 URL을 입력해도 작동하지 않습니다.
  • 그리고 더 많은...

" 초보자는 규칙을 알고 있지만 재향 군인은 예외를 알고 있습니다. "

어쨌든 좁은 사용 사례에 대한 일부 규칙에 위배되는 유효한 변명을 찾게 될 수도 있습니다. 그러나 연구를 수행하고 모든 가능성을 고려하십시오. 그렇지 않으면, 당신은 도끼 상호 운용성과 "사용자 경험"을 망칠 것입니다.

사용자가 항상 테스트 한 주류 브랜드 클라이언트 / 사용자 에이전트의 최신 롤아웃을 항상 사용한다고 보장 할 수는 없습니다. 고객은 자신의 필요에 맞는 현지 브랜드 (포함), 다음 전문점에서 주문한 맞춤형 브랜드 또는 창고에서 파는 빈티지 브랜드를 사용할 수 있습니다. 이 모든 것들이 있어도 귀하의 사이트는 여전히 합리적인 서비스를 제공해야합니다. 이것이 우리에게 표준이있는 이유입니다.

부주의하게 표준을 위반한다는 것은 사용자를 차별 하는 것입니다.


3

이론적으로 우리가 모든 곳에서 사용할 수 있으며 일종의 작업이 될 수 있습니다. 일부 소프트웨어는 요청 본문과 함께 GET을 사용하기도합니다 (탄력 검색 / 키바 나를보고 있습니다). 물론 이것은 끔찍한 일입니다.

가장 중요한 이유는 다른 방법이 다른 의미를 갖기 때문입니다. 일부는 안전하고 일부는 dem 등식입니다. 일부는 둘 다입니다. 어느 쪽인지 확인

예를 들어 다른 응용 프로그램과 상호 작용할 때 중요합니다. GET 엔드 ​​포인트는 부작용이 없어야합니다. 구글이 당신 편을 크롤링 할 때 중요하다. PUT은 dem 등원이어야하는데, 이는 장애 발생시 클라이언트가 자유롭게 다시 시도 할 수 있음을 의미합니다. POST 요청의 경우에는 그렇지 않습니다. 포스트 요청에서 f5를 누르면 브라우저에 못생긴 확인 상자가 있어야하는 이유입니다.

POST를 사용해야했던 곳에서 GET을 사용하면 어떤 일 이 발생할 수 있는지 확인


1
본체가있는 GET은 실제로 사양을 준수합니다.
TRiG

흥미 롭군
Esben Skov Pedersen

1
신체가있는 GET은 일치하지 않으며 더 이상 구체적으로 위반하지 않습니다. 이제 정의되지 않았으므로 일부 클라이언트는이를 지원하지 않습니다. 나는 cURL이 하나의 예라고 믿는다
Mars

2

GET, POST 등을 동일한 함수의 과부하 또는 게터 및 세터로 생각할 수도 있습니다.

GET_MyVar() 입력 매개 변수 (일명 요청 본문)를 사용하지 않지만 무언가를 반환합니다.

POST_MyVar(string blah)입력으로 무언가를 요청하고 (다시 요청 본문) 무언가를 반환 할 수 있습니다. (적어도 응답 코드를 반환해야 함수가 실행되었음을 알 수 있습니다 !!)

DELETE_MyVar() 또한 아무것도하지 않으며 무언가를 삭제할 것으로 예상됩니다.

그렇습니다.
MyVar(string Action, string? blah)

이 방법으로 우리는 단 한 번의 호출을 수락 한 다음 다른 매개 변수를 기반으로 수행 할 작업을 선택할 수 있습니다.

그러나이 방법의 편의 중 하나는 브라우저와 서버가 이러한 방식으로 작업을 최적화 할 수 있다는 것입니다. 예를 들어 서버가 where 모든 요청을 차단하려고 할 수 Action==DELETE있습니다. 아마도 브라우저는 Action==GET.그렇지 않은 경우 모든 기능에서 우리가 작성 해야하는 것을 캐시하려고 할 것입니다if (Action==Delete) {return AngryFace}

프로토콜에 따라 모든 것을 정확하게 구현할 필요는 없지만 프로토콜은 기본적으로 우리 모두가 준수하기로 결정한 규칙 세트입니다. 이렇게하면 서버를 보지 않아도 사이트에서 수행 할 작업을 쉽게 추측 할 수 있습니다.


1

HTTP 메소드는 다른 목적으로 사용됩니다. 일반적으로 GET다운로드 용이며 POST업로드 용입니다.

요청 본문과 응답 본문 만 사용하여 HTTP 프로토콜의 일부를 구현하는 유일한 방법은 구현하는 것 POST입니다. GET요청 본문이 없습니다. 헤더가있는 요청 자체 만 있지만 본문은 없습니다. 문서 다운로드 요청입니다. POST요청 본문 (파일 업로드)과 응답 본문 (결과를 보여주는 문서)이 모두 있습니다.

구현 POST하고 완료 할 수 있습니까? 표준 브라우저에서 사이트를 사용하려는 경우에는 아닙니다. 브라우저가 보내는 기본 요청 유형은 GET입니다. POST요청은 일반적으로 웹 페이지의 양식을 제출하거나 AJAX 호출에 대해서만 전송됩니다. 이 특정 서버가 AJAX 호출에만 사용되고 사용자가 볼 수있는 페이지에는 사용되지 않은 경우 POST에만 도망 갈 수 있습니다 .

브라우저는 또한 HEAD문서를 마지막으로 다운로드 한 이후로 문서가 변경되었는지 확인하기 위해 요청을 보내 므로 적어도 해당 문서를 구현하는 것이 좋습니다.

어쨌든 처음부터 사이트를위한 웹 서버를 구현해야 할 이유가 없습니다. HTTP 프로토콜은 복잡합니다. 다양한 방법 외에도 파이프 라이닝 및 청크 요청을 구현해야합니다. HTTP, HTTP 프로토콜을 처리하는 Apache, Nginx 또는 IIS와 같은 웹 서버 위에 웹 응용 프로그램을 구축하는 것이 훨씬 쉽습니다. 서블릿을 언급 했으므로 서블릿을 실행하는 Tomcat 또는 JBoss 웹 서버를 사용해야합니다.


이 질문은 A 웹 사이트보다 더 큰 수준이라고 생각합니다. "GET 및 POST를 구현해야하는 이유"가 아니라 "브라우저가 GET 및 POST를 구현하는 이유"는 무엇입니까?
Mars

@Mars이 경우에는이 사이트에 대한 질문이 주제에 맞지 않습니다.
Stephen Ostermiller

그것은 내가 생각한 역사 질문이며 전체 웹 사이트에 영향을 미치는 문제 (질문하기 페이지에서)에 속하는 것처럼 보입니다 . 그러나 OP는 사라져서 항상 미스테리가 될 것 같아요
Mars

0

GET, POST, PUT 등이 HTTP를 POST 방법으로 대체하고 다른 방법으로 대체하지 않으면 GET, POST, PUT 등은 역사적인 관습입니다 .GET을 제거하는 것이 큰 사업이라는 것을 인정해야하지만, 할 수 없었습니다, 말은 이미 그 하나에 볼트


1
"GET, POST, PUT 등은 단지 역사적인 규칙입니다"– 규칙이 아닙니다. 그들은 정확하게 행동을 구체화 했으며, 또한 다른 행동 을 정확하게 구체화했습니다 .
Jörg W Mittag

웹 API 개발자로서 GET을 POST와 쉽게 상호 교환 할 수 있으며 그 반대의 경우도 마찬가지입니다. 정직한 POST에는 해결해야 할 문제가 적고 ID가 모든 API 메소드를 POST 메소드로 만드는 경우
user104723

-1

제안 된 프로토콜은 해커에 대한 보안 수준이 상당히 낮습니다.

웹 사이트가 변수에 대한 정보를 URL에 저장하지 않는 이유가 있으며 그 이유는 간단합니다. 공격자가 시스템을 공격 할 수있는 매우 간단한 방법입니다. 일반 텍스트 URL 정보를 관찰하면 웹 서버로 전송 된 데이터가 구성되는 방식을 결정할 수 있습니다. 그런 다음이 정보를 사용하여 악의적 인 코드 나 데이터를 서버에 주입 할 수 있도록 특별히 구성된 URL을 사용하여 서버에 대한 공격을 실행할 수 있습니다.


HTTPS 하에서 GET의 내용은 네트워크에 전혀 평범한 텍스트가 아닙니다 ... 공격자들은 운이 좋거나 무차별 대입 등의 기술을 통해 악성 코드를 삽입 할 수 있습니다.
Patrick Mevzek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.