HTTP 쿼리 (HTTP 메시지) 란 무엇입니까? 브라우저에서 게시물 요청을 보내는 방법 : 메소드 게시 HTTP 쿼리 란 무엇입니까?

이전 메모에서 검토 한 후 HTTP 프로토콜 - POST 메서드에서 쿼리를 보내는 또 다른 방법이 있습니다. POST 방법은 실제로 매우 자주 사용됩니다.

GET 메소드를 참조하기 위해 URL에 요청을 입력 할 수 있습니다. 그런 다음 모든 것이 다른 원칙에 따라 POST 메소드에서 작동합니다.

이러한 유형의 요청을 실행하려면 웹 페이지에있는 type \u003d "submit 속성"으로 단추를 클릭해야합니다. 이 버튼은 요소에 있습니다.

게시물 값이있는 방법 속성을 사용합니다.

이 HTML 코드를 고려하십시오.

텍스트를 입력하십시오.


사용자가 텍스트 필드에 텍스트를 입력하고 "제출"버튼을 클릭하면 사용자가 입력 한 콘텐츠의 내용이있는 텍스트 변수가 서버로 전송됩니다. 이 변수는 POST 메소드에서 전송됩니다.

양식을 작성하는 경우 :

그 데이터는 GET 메소드에서 전송됩니다.

GET 요청의 경우, 우리가 전송할 수있는 데이터의 양은 브라우저 길이 길이로 제한되면, POST 요청의 경우, 그러한 제한은 없으며 상당한 양의 정보를 전송할 수 있습니다.

POST 방법의 또 다른 차이점, POST 방법은 그 (것)들로 전송 된 모든 변수들과 그 신체의 그들의 가치 (엔티티 - 본문)를 숨 깁니다. GET 메소드의 경우 쿼리 문자열 (요청 URI)에 저장되었습니다.

다음은 POST 메소드가 만든 요청의 예입니다.

post / http / 1.0 \\ r \\ n.
호스트 : www.site.ru \\ r \\ n.
referer : http://www.site.ru/index.html \\ n.
쿠키 : 소득 \u003d 1 \\ r \\ n.
콘텐츠 형식 : 응용 프로그램 / x-www-form-urlencoded \\ r \\ n
콘텐츠 - 길이 : 35 \\ r \\ n.
\\ r \\ n.
login \u003d dima & password \u003d 12345.

따라서 POST 방법으로 데이터를 통과하면 공격자를 가로 챌 수 없기 때문에 훨씬 더 어려울 것입니다. 그들은 직접보기에서 숨겨져 있으므로 POST 메소드로 데이터를 전송하는 방법은보다 안전한 것으로 간주됩니다.

또한 POST 메서드는 텍스트뿐만 아니라 멀티미디어 데이터 (그림, 오디오, 비디오)를 전송할 수 있습니다. 전송할 정보의 유형을 정의하는 특별한 Content-Type 매개 변수가 있습니다.

마지막 으로이 방법으로 전송 된 데이터를 가져 오려면 POST 변수가 사용됩니다.

다음은 PHP에서의 처리의 예입니다.

echo $ _post [ 'text'];
?>

그런데, 나는 Yandex Metric 및 Google Analytics 시스템의 보고서, 목표 및 이벤트를 구성합니다.

당신은 프로그래머가 아닌지, 당신은 인터넷의 모든 곳에서 보았습니다. 현재 "http : //"로 시작하는 것이 브라우저의 주소 표시 줄에 표시됩니다. 첫 번째 Hello World Script조차도 이해없이 HTTP 헤더를 보냈습니다. 이 기사에서는 HTTP 헤드 라인의 기본 사항과 웹 응용 프로그램에서 사용 가능한 방법에 대해 알게 될 것입니다.

HTTP 헤더 란 무엇입니까?

HTTP는 "하이퍼 텍스트 전송 프로토콜"(하이퍼 텍스트 전송 프로토콜)을 의미합니다. 월드 와이드 웹은이 프로토콜을 사용합니다. 그것은 1990 년대 초반에 만들어졌습니다. 브라우저에서 볼 수있는 거의 모든 것이 HTTP를 통해 컴퓨터로 전달됩니다. 예를 들어이 기사를 열면 브라우저가 40 개 이상의 HTTP 요청을 보냈고 각각에 대해 HTTP 답변을 받았습니다.

HTTP 헤더는 이러한 HTTP 요청 및 답변의 주요 부분이며 페이지가 요청한 클라이언트 브라우저 정보를 수행합니다. 서버 및 다른 많은 것들이 요청합니다.

주소 표시 줄에 URL을 입력하면 브라우저가 HTTP 요청을 보냅니다. 다음과 같이 보일 수 있습니다.

get / tutorials / other / top-20-mysql-best-practices / http / 1.1 host : net.tutsplus.com 사용자 - 에이전트 : Mozilla / 5.0 (윈도우; u; 윈도우 NT 6.1; en-kr; rv : 1.9. 1.5) Gecko / 20091102 Firefox / 3.5.5 (.NET CLR 3.5.30729) 수락 : 텍스트 / HTML, Application / XHTML + XML, Application / XML; Q \u003d 0.9, * / *; Q \u003d 0.8 수락 언어 : en -us, en; q \u003d 0.5 수락 - 인코딩 : Gzip, Deflate Accept-Charset : ISO-8859-1, UTF-8; Q \u003d 0.7, *; Q \u003d 0.7 keep-alive : 300 연결 : 유지 보관 쿠키 : phpsessid \u003d r2t5uvjq435r4q7ib3vtdjq120 Pragma : 아니 캐시 캐시 제어 : 아니 캐시

첫 번째 줄은 요청에 대한 몇 가지 기본 정보를 포함하는 "요청 줄"입니다. 나머지 HTTP 헤드 라인.

이 요청이 끝나면 브라우저가 다음과 같이 보일 수있는 HTTP 응답을받습니다.

HTTP / 1.x 200 OK 전송 인코딩 : Chunked Date : Sat, Sat, 2009 GMT 서버 : Litespeed 연결 : Close X-Powered-by : W3 Total Cache / 0.8 Pragma : Public Expires : SAT , 2009 년 11 월 28 일 05:36:25 GMT ETAG : "PUB1259380237; GZ"캐시 제어 : max-age \u003d 3600, 공용 콘텐츠 형식 : 텍스트 / html; charset \u003d utf-8 last-modified : Sat, 28 11 월 2009 03:50:37 GMT x-pingback : http://net.tutsplus.com/xmlrpc.php 콘텐츠 인코딩 : GZIP는 다양합니다 : accept-encoding, cookie, 사용자 에이전트 상위 20+ MySQL 모범 사례 - NETTUTS +

첫 번째 줄은 "status string", "HTTP 헤더", 빈 문자열에 "http 헤더"입니다. 그런 다음 "콘텐츠"가 시작됩니다 (이 경우 - HTML 출력에서).

브라우저에서 웹 페이지의 소스 코드를 볼 때 HTTP 헤더가 아닌 HTML의 일부만이 표시되지만 실제로 함께 전송되었습니다.

이러한 HTTP 요청은 이미지, CSS 파일, JavaScript 파일 등과 같은 다른 것들에 대해서도 전송되고 받아 들여집니다. 그래서 브라우저 가이 문서 페이지 만 다운로드 할 때 최소 40 개 이상의 HTTP 요청을 보냈습니다.

이제 구조를보다 자세하게 살펴 보겠습니다.

HTTP 헤더를 보는 방법

HTTP 헤더를 분석하려면 다음 Firefox 확장을 사용합니다.

HTTP 쿼리의 HTTP 헤더

이제 우리는 HTTP 요청에서 발견 된 가장 일반적인 HTTP 헤더 중 일부를 살펴 보겠습니다.

거의 모든 헤드 라인은 PHP의 $ _server 배열에서 찾을 수 있습니다. getAllHeaders () 함수를 사용하여 모든 헤드 라인을 동시에 추출 할 수도 있습니다.

주최자.

HTTP 요청은 특정 IP 주소로 전송됩니다. 그러나 대부분의 서버가 하나의 IP에 여러 사이트를 게시 할 수 있으므로 브라우저를 찾고있는 도메인 이름을 알아야합니다.

호스트 : net.tutsplus.com.

이것은 기본적으로 도메인 및 하위 도메인을 포함하여 이름 호스트입니다.

PHP에서는 $ _server [ "http_host"] 또는 $ _server [ "server_name"]로 찾을 수 있습니다.

사용자 에이전트

사용자 - 에이전트 : Mozilla / 5.0 (Windows; u; 윈도우 NT 6.1; en-us; rv : 1.9.1.5) Gecko / 20091102 Firefox / 3.5.5 (.NET CLR 3.5.30729)

이 제목에는 다음과 같은 여러 가지 정보가 포함될 수 있습니다.

  • 브라우저의 이름과 버전.
  • 운영 체제의 이름과 버전.
  • 기본 언어.

웹 사이트가 서퍼 시스템 시스템에 대한 전반적인 정보를 수집 할 수 있도록합니다. 예를 들어, 서퍼가 모바일 브라우저를 사용하고 웹 사이트의 모바일 버전으로 리디렉션하는지 여부를 결정할 수 있습니다.이 웹 사이트의 모바일 버전으로는 더 나은 해상도로 작업합니다.

PHP는 다음과 같이 표현할 수 있습니다 : $ _server [ "http_user_agent"].

if (strstr ($ _ 서버 [ "http_user_agent"], "MSie 6")) (ECHO "ie6 사용을 중지하십시오!";)

수락 언어.

수락 언어 : en-us, en; q \u003d 0.5

이 제목은 기본 언어 설정을 표시합니다. 사이트에 언어 버전이 다른 경우이 데이터를 기반으로 새 서퍼를 리디렉션 할 수 있습니다.

PHP에서는 다음과 같이 찾을 수 있습니다 : $ _server [ "http_accept_language"].

if (substr ($ _ 서버 [ "http_accept_language"], 0, 2) \u003d\u003d "FR") (헤더 ( "위치 : http://french.mydomain.com"));)

수락 - 인코딩

수락 - 인코딩 : gzip, deflate.

대부분의 현대적인 브라우저는 GZIP를 지원하고 헤더로 보냅니다. 그런 다음 웹 서버는 압축 된 형식으로 출력 HTML 코드를 보낼 수 있습니다. 이를 통해 대역폭과 시간을 절약하기 위해 최대 80 %까지의 크기를 줄일 수 있습니다.

PHP에서는 다음과 같이 찾을 수 있습니다 : $ _server [ "http_accept_encoding"]. 그러나 ob_gzhandler () 콜백 함수를 사용하면 자동으로 값을 확인하므로 필요하지 않습니다.

// 브라우저가 ob_start ( "ob_gzhandler")를 지원하는 경우 출력 버퍼링 // 및 모든 출력이 압축을 가능하게합니다.

if-modified- 이후

웹 문서가 브라우저에서 Keshe에 이미 저장되고 다시 방문하면 브라우저가 다음을 보내 문서가 업데이트되었는지 확인할 수 있습니다.

이 날짜부터 변경되지 않은 경우 서버는 "304 수정되지 않은"응답 코드를 보내고 내용이 아닙니다. 브라우저는 캐시에서 내용을로드합니다.

PHP에서는 다음과 같이 찾을 수 있습니다 : $ _server [ "http_if_modified_since"].

// $ last_modify_time가 마지막 출력이 업데이트되었거나 브라우저가 if-modified-modified-header를 보내셨습니까? if ($ _modified_since "])) ($ last_modify_time \u003d\u003d strotime ($ _modific_tince"http_if_modified_since "])) ($ _modify_time \u003d\u003d strotime ($ _modified_since"]) 수정 시간과 일치하는 경우 ($ _modified_since "])) (// 및 콘텐츠 헤더 없음 ( "HTTP / 1.1 304 수정되지 않음"); 종료;))

또한 현재 캐시를 확인하는 데 사용할 수있는 ETAG HTTP 헤더가 있습니다. 우리는 가까운 장래에 그것에 대해 이야기 할 것입니다.

쿠키

이름이 뒤 따르면이 도메인에 대한 브라우저에 저장된 쿠키를 보냅니다.

쿠키 : phpsessid \u003d r2t5uvjq435r4q7ib3vtdjq120; foo \u003d bar.

이들은 쉼표 도트로 구분 된 이름 \u003d 값 쌍입니다. 쿠키에는 세션 ID가 포함될 수도 있습니다.

PHP에서는 배열 $ _cookie를 사용하여 개별 쿠키를 액세스 할 수 있습니다. $ _session 배열을 사용하여 세션 변수에 직접 액세스 할 수 있으며 세션 ID가 필요한 경우 쿠키 대신 session_id () 함수를 사용할 수 있습니다.

echo $ _cookie [ "foo"]; // 출력 : bar echo $ _cookie [ "phpsessid"]; // 출력 : r2t5uvjq435r4q7ib3vtdjq120 session_start (); echo session_id (); // 출력 : r2t5uvjq435r4q7ib3vtdjq120.

referer.

이름이 뒤 따르면이 HTTP 헤더에는 참조 URL이 포함됩니다.

예를 들어, 내가 NETTUTS + 홈페이지로 가서 기사 링크를 클릭하면이 헤더가 내 브라우저로 전송됩니다.

referer : http://net.tutsplus.com/

PHP에서 $ _server [ "http_referer"]로 찾을 수 있습니다.

if ($ _ $ _ 서버 [ "http_referer"]) ($ url_info \u003d parse_url ($ _ 서버 [ "http_referer"]); // google에서 오는 서퍼가 있습니까? ($ url_info [ "호스트"\u003d\u003d "www .google.com") (parse_str ($ url_info [ "quer", $ vars); echo "이 키워드에 대해 Google에서 검색 :"$ vars [ "q"];) // 참조 URL WAS : // http://www.google.com/search?source\u003dig&hl\u003den&rlz\u003d& shl\u003den&rlz\u003d&aq\u003df&oq\u003d&aq\u003df&oq\u003d&aqi\u003dg-p1g9 // 출력이 다음과 같습니다. //이 Google에서 검색했습니다. 키워드 : http 헤더

"Referrer"라는 단어가 "referer"와 같은 오류로 작성되었음을 알 수 있습니다. 불행히도 공식 HTTP 사양으로 유사하게 바뀌 었습니다.

권한 부여

권한 부여 : 기본 BXL1C2VYOM15CGFZCW \u003d\u003d.

헤더 내부의 데이터는 인코딩 된 Base64입니다. 예를 들어 base64_decode ( "bxl1c2vyom15cgfzcw \u003d\u003d")는 "myuser : mypass"를 반환합니다.

PHP 에서이 값은 $ _server [ "php_auth_user"] 및 $ _server [ "php_auth_pw"]로 찾을 수 있습니다.

이 정보에 대한 자세한 내용은 WWW 인증 헤더에 대해 이야기 할 때가됩니다.

HTTP 응답의 HTTP 헤더

이제 HTTP 응답에서 발견 된 가장 일반적인 HTTP 헤더 중 일부를 살펴 보겠습니다.

PHP에서는 header () 함수를 사용하여 응답 헤더를 설정할 수 있습니다. PHP는 이미 특정 헤더를 자동으로 보내고 쿠키 및 기타의 내용 및 구성을 다운로드하거나 headers_list () 함수를 사용하여 전송되거나 전송 될 헤더를 볼 수 있습니다. 헤더가 headers_sent () 함수를 사용하여 이미 전송되었는지 확인할 수 있습니다.

캐시 제어

w3.org의 정의 : "캐시 제어 헤더 필드는 쿼리 / 답글 체인의 모든 캐싱 메커니즘에 의해 수행 될 지시문을 지정하는 데 사용됩니다." 이러한 "캐싱 메커니즘"에는 인터넷 제공 업체가 사용할 수있는 게이트웨이와 프록시가 포함됩니다.

캐시 제어 : 최대 연령 \u003d 3600, 공개

"대중"은 누구에게나 답변을 캐싱 할 수 있음을 의미합니다. "Max-Age"는 캐시가 유효한 몇 초의 몇 초를 나타냅니다. 사이트 캐싱의 허가는 서버 및 대역폭의로드를 줄일뿐만 아니라 브라우저에서 다운로드 시간을 늘릴 수 있습니다.

캐싱은 No-Cache 지시문을 사용하여 방지 할 수도 있습니다.

캐시 제어 : 아니 캐시

컨텐츠 타입.

이 헤더는 "MIME 유형"문서를 지정합니다. 그런 다음 브라우저는이 내용을 해석하는 방법을 결정합니다. 예를 들어, HTML 페이지 (또는 HTML 출력이있는 PHP 스크립트)는 다음을 반환 할 수 있습니다.

콘텐츠 형식 : 텍스트 / HTML; charset \u003d UTF-8.

"text"는 문서의 유형 및 "html"- 문서의 하위 유형입니다. 제목에는 문자 세트와 같은 더 많은 정보가 포함될 수도 있습니다.

GIF 이미지의 경우 전송할 수 있습니다.

콘텐츠 형식 : 이미지 / GIF.

브라우저는 외부 응용 프로그램 또는 MIME 유형 기반 브라우저를 사용할 수 있습니다. 예를 들어, 이것은 Adobe Reader를로드합니다.

콘텐츠 형식 : 응용 프로그램 / PDF.

로드 중에 Apache는 대개 MIME 유형의 문서를 감지하고 해당 헤더를 보낼 수 있습니다. 또한 대부분의 브라우저는 헤더가 올바르지 않거나 없으면 대부분의 브라우저에서는 정도의 내결함성과 MIME 유형의 자동 정의가 있습니다.

일반적인 MIME 유형 목록을 찾을 수 있습니다.

PHP에서 FINFO_FILE () 함수를 사용하여 MIME 파일 유형을 결정할 수 있습니다.

콘텐츠 처분

이 헤더는 내용을 분석하는 대신 파일 다운로드 창을 열려면 브라우저를 지정합니다. 예:

콘텐츠 - 처분 : 첨부; filename \u003d "download.zip"

그것은 브라우저가 그것을 할 것입니다 :

해당 콘텐츠 형식 헤더도 다음과 같이 전송해야합니다.

콘텐츠 유형 : 응용 프로그램 / Zip Content-Disposition : 첨부 파일; filename \u003d "download.zip"

콘텐츠 길이.

콘텐츠가 브라우저로 전송되면 서버는이 헤더를 사용하여 크기 (바이트)를 지정할 수 있습니다.

콘텐츠 - 길이 : 89123.

이것은 파일을 다운로드 할 때 특히 유용합니다. 이는 브라우저가 부트 코스를 결정할 수있는 방법입니다.

예를 들어, 여기에서 내가 쓴 레이아웃 스크립트는 느린 다운로드를 모방합니다.

// zip 파일 머리글 ( "콘텐츠 형식 : 응용 프로그램 / zip"); // 백만 바이트 ( "Content-length : 1000000"); // 다운로드 대화 상자를로드하고 Download.zip 헤더로 저장합니다 ( "Content-Disposition : 첨부 파일; filename \u003d"download.zip "); // 1000 배 1000 바이트 데이터의 1000 바이트 ($ i \u003d 0; $ i< 1000; $i++) { echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); }

결과는 다음과 같습니다.

이제 콘텐츠 길이 헤더에 대해 논평 할 것입니다.

// zip 파일 머리글 ( "콘텐츠 형식 : 응용 프로그램 / zip"); // 브라우저는 크기 // 헤더 ( "Content-length : 1000000")를 알고 있습니다. // 다운로드 대화 상자를로드하고 Download.zip 헤더 ( "Content-DispenSition : attachment; filename \u003d"download.zip ")로 저장하십시오. // 1000 배 1000 바이트 ($ I \u003d 0, $ i< 1000; $i++) { echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); }

이제 결과는 다음과 같습니다.

브라우저는 몇 바이트가로드되었는지만을 말할 수 있지만 총 금액은 알지 못합니다. 실행 표시기가 진행 상황을 표시하지 않습니다.

etag.

이것은 캐싱에 사용되는 또 다른 헤더입니다. 다음과 같습니다.

ETAG : "PUB1259380237; GZ"

웹 서버는이 헤더를 제공하는 각 문서로 전송할 수 있습니다. 값은 마지막 수정 된 날짜, 파일 크기 또는 파일 체크섬을 기반으로 할 수 있습니다. 그런 다음 브라우저는 문서를 캐시 할 때이 값을 저장합니다. 다음 번 브라우저가 동일한 파일을 요청하면 HTTP 요청으로 전송합니다.

if-none-match : "pub1259380237; gz"

문서 etag 값이 일치하면 서버는 200 대신 코드 304 및 내용이 아닙니다. 브라우저가 캐시에서 내용을 다운로드합니다.

마지막으로 수정되었습니다.

이름이 뒤 따르면이 헤더는 GMT 문서의 마지막 변경 날짜를 나타냅니다.

Last-Modified : SAT, 2009 년 11 월 28 일 03:50:37 GMT $ modify_time \u003d FileMTime ($ file); 헤더 ( "마지막 수정 :". GMDATE ( "D, D, D, D, D, D, D, D, D, $ MODIFY_TIME)"GMT ");

그것은 캐시 문서를위한 다른 방법으로 브라우저를 제공합니다. 브라우저는 HTTP 요청으로 보낼 수 있습니다.

우리는 이미 "if-modified-burch"섹션 에서이 작업에 대해 이미 이야기했습니다.

위치

이 제목은 리디렉션하는 데 사용됩니다. 응답 코드가 301 또는 302 인 경우 서버 도이 헤더를 보내야합니다. 예를 들어, 처음 페이지 http://www.nettuts.com으로 이동하면 브라우저가 다음을 받게됩니다.

HTTP / 1.x 301 영구적으로 이동 ... 위치 : http://net.tutsplus.com/

PHP에서는 서퍼를 리디렉션 할 수 있습니다.

헤더 ( "위치 : http://net.tutsplus.com/");

기본적으로 302 개의 응답 코드를 보냅니다. 301 대신에 원하는 경우 :

헤더 ( "위치 : http://net.tutsplus.com/", true, 301);

세트 쿠키.

웹 사이트가 브라우저에서 쿠키 파일을 설치하거나 업데이트하려는 경우이 헤더를 사용합니다.

세트 쿠키 : Skin \u003d Noskin; 경로 \u003d /; 도메인 \u003d .amazon.com; 만료 \u003d Sun, 29-Nov-2009 21:42:28 GMT 쿠키 : 세션 -D \u003d 120-7333518-8165026; 경로 \u003d /; 도메인 \u003d .amazon.com; 만료 \u003d Sat 27:00:00 2010 GMT.

각 쿠키 파일은 별도의 헤더로 전송됩니다. JavaScript를 사용하여 설치된 쿠키는 HTTP 헤더를 통과하지 않습니다.

PHP에서는 setcookie () 함수를 사용하여 쿠키를 설정할 수 있으며 PHP는 해당 HTTP 헤더를 보냅니다.

setcookie ( "TestCookie", "foobar");

이 제목을 보내는 것은 무엇입니까?

세트 쿠키 : TestCookie \u003d foobar.

만료 날짜가 지정되지 않으면 브라우저 창이 닫힐 때 쿠키가 삭제됩니다.

www-authenticate.

이 사이트는이 헤더를 보낼 수 있도록 HTTP를 통해 사용자를 인증 할 수 있습니다. 브라우저 가이 헤더를 볼 때 로그인 대화 상자가 열립니다.

www-authenticate : 기본 영역 \u003d "제한 영역"

이처럼 보일 것입니다 :

우리는 브라우저 (클라이언트)가 HTTP 서버에 요청을 보내고 서버가 HTTP 클라이언트에 대한 응답을 보냅니다. 이러한 요청 및 답변은 \u200b\u200b특정 규칙에 따라 발행됩니다. 시퀀스를 쓰여야하는 구문과 같은 구문과 같습니다. 엄격하게 정의 된 구조가 있어야합니다.

이 구조를 HTTP 프로토콜에서 요청 및 답변을 구축하는 더 자세히 설명합니다.

HTTP 요청은 아래에 나열된 순서대로 3 개의 주요 부품으로 구성됩니다. 헤더와 메시지의 본문 사이에 빈 줄이 있습니다 (구분 기호) 문자열 변환 기호입니다.

1. 요청 라인 (요청 라인)

2. 헤더 (메시지 헤더)

빈 문자열 (구분 기호)

3. 메시지 본문 (엔티티 본문) - 선택적 매개 변수

행 요청 - HTTP 프로토콜 버전에 액세스 해야하는 URL 주소 인 전송 방법을 나타냅니다.

헤드 라인 - 메시지 본문을 설명하고, 다른 매개 변수 및 기타 정보 및 정보를 전송하십시오.

메시지 본문 - 이것은 요청에서 전송되는 데이터입니다. 메시지 본문은 선택적 매개 변수이며 누락되지 않을 수 있습니다.

서버에서 응답을 받으면 메시지 본문이 가장 자주 웹 페이지의 내용입니다. 그러나 서버에 대한 쿼리를 쿼리 할 때, 예를 들어 피드백 양식에 채워진 데이터를 서버에 전달할 때도있을 수 있습니다.

각 쿼리 요소는 더 자세히 알려줍니다. 다음 음을 살펴 보겠습니다.

예를 들어 서버에 대한 하나의 실제 요청을 고려해 보겠습니다. 나는 쿼리의 각 부분을 내 색상으로 강조 표시했습니다. 쿼리 줄 - 녹색, 헤드 라인 - 주황색, 본문 메시지는 파란색입니다.

브라우저에서 요청 :

get / http / 1.1.

호스트 : 사이트

사용자 - 에이전트 : Mozilla / 5.0 (Windows NT 6.1, RV : 18.0) Gecko / 20100101 Firefox / 18.0

수락 : 텍스트 / HTML, 응용 프로그램 / xhtml + xml, application / xml; q \u003d 0.9, * / *; q \u003d 0.8

수락 언어 : Ru-en, ru; q \u003d 0.8, en-us; q \u003d 0.5, en; q \u003d 0.3

수락 - 인코딩 : gzip, deflate.

쿠키 : WP-Settings.

연결 : 유지

다음 예제에서는 이미 메시지 본문이 있습니다.

서버 답변 :

HTTP / 1.1 200 OK

콘텐츠 형식 : 텍스트 / HTML; charset \u003d UTF-8.

전송 - 인코딩 : Chunked.

연결 : 유지

유지 보수 : Timeout \u003d 5.

서버 : Apache.

x-pingback : //syt/xmlrpc.php.

제목 없음



다음은 클라이언트와 HTTP 서버의 메시지입니다.

그런데, 나는 Yandex Metric 및 Google Analytics 시스템의 보고서, 목표 및 이벤트를 구성합니다.

요청 구조 (8)

쿼리 http에서. 가져 오기. 매개 변수는 다음과 같이 전송됩니다 행 요청 :

http://example.com/page. ? 매개 변수 \u003d 값 & 또한 다른 \u003d

쿼리 http에서. 게시하다. 매개 변수는 URI와 함께 전송되지 않습니다.

값은 어디에 있습니까? 요청 헤더에서? 쿼리 본문에서? 그것은 어떻게 생겼습니까?

대답.

HTTP-POST 메시지의 양식 값은 요청과 동일한 형식으로 쿼리 본문으로 전송됩니다.

자세한 내용은 사양을 참조하십시오.

일부 웹 서비스는 귀하가 배치해야합니다 데이터 I. 메타 데이터 갈라져. 예를 들어, 원격 기능은 서명 된 메타 데이터 문자열이 URI에서 활성화되고 데이터가 HTTP 패키지에서 전송 될 것으로 예상 할 수 있습니다.

게시물 요청은 의미 론적으로 다음과 같이 보일 수 있습니다.

post /? authid \u003d yourkey & action \u003d webserviceaction & signature \u003d rclxfkpldrym04 http / 1.1 content-type : 텍스트 / 탭 - 분리 값; charset \u003d ISO-8859-1 콘텐츠 - 길이 : 호스트 : webservices.domain.com 수락 : 텍스트 / html, 응용 프로그램 / xhtml + xml, application / xml; q \u003d 0.9, * / *; q \u003d 0.8 수락 - 인코딩 : ID 사용자 - 에이전트 : Mozilla / 3.0 (호환 가능, 인디 라이브러리) 이름 ID John G12n Sarah J87M Bob N33Y

이 접근법은 웹 서버의 "syntaxssurs의 지침"인 하나의 콘텐츠 형식을 사용하여 QueryString 및 Body-Post를 논리적으로 결합합니다.

노트 : http / 1.1. 포장 된 것 왼쪽에 # 32 (공백)와 오른쪽 # 10 (라인 피드).

우선, 가져 가자

받다: 이것은 서버에서 수행되는 HTTP 기본 요청이며 서버에서 데이터를 추출하는 데 사용되며 쿼리 문자열은 다음과 같습니다. URI는 고유 한 자원을 추출하는 데 사용됩니다.

이것은 형식입니다

get /someweb.asp?data\u003dvalue http / 1.0을 가져옵니다

여기서 data \u003d value - 전송 된 쿼리 문자열 값입니다.

게시하다: 필요한 모든 것이 필요한 모든 파일이 필요한 모든 것을 서버에 안전하게 전송하는 데 사용됩니다.

post / somweb.asphttp/1.0 호스트 : localhost content-type : application / x-www-form-urlencoded // 여기에 모든 형식을 입력 할 수 있습니다 콘텐츠 - 길이 : 11 // 그것은 이름 \u003d somename에 종속됩니다.

왜 게시물을 가져 오는거야?

서버에 전송 된 값 값에서 일반적으로 쿼리 문자열의 기본 URL에 추가됩니다. 이렇게하면 데이터를 해킹 할 수 있습니다 (자격 증명이 설치된 Facebook의 일이었습니다.) 요청 본문을 사용한 서버로 데이터를 보내는 데 사용한 게시물이 안전한 서버로 데이터를 보냅니다. 그것은 당신의 데이터를 숨겨서 필드에서 데이터를 가져오고, 길이를 계산하고 콘텐츠 길이의 헤더에 추가하고 중요한 데이터가 URL에 직접 추가되지 않습니다.

이제는 귀하의 요청이 보호되어 있으므로 서버로 전송 된 값은 이름에서 보내려는 데이터 사용자가 포함되어 있음을 암시하는 것으로 본문을 요청하므로 다음과 같이 보냅니다. 요청 헤더는 요청 본문의 값을 요청 헤더와 비교하여 보안 요청을 저장합니다.

Google 개발자 도구 네트워크 섹션을 사용하여 요청이 서버에서 실행되는 방법에 대한 기본 정보를 찾을 수 있습니다.

그리고 캐시 제어, 원본, 수락과 같은 요청 헤더에 항상 더 많은 값을 추가 할 수 있습니다.

짧은 대답: 사후 쿼리에서 값은 요청의 "본문"으로 전송됩니다. 웹 양식에서는 응용 프로그램 / x-www-form-urlencoded 또는 multipart / form-data의 미디어 유형으로 가장 많이 보냈습니다. 웹 요청 처리를위한 프로그래밍 또는 프레임 워크는 일반적으로 이러한 요청으로 "올바른 Thing ™"에 의해 수행되며 쉽게 디코딩 된 값 (예 : PHP 또는 CGI.FIELDSTORAGE ()에서 $ _REQUEST 또는 $ _POST)에 쉽게 액세스 할 수 있습니다. 플라스크 .REQUEST.REQUEST.FORM에서 파이썬에서).

이제는 그 차이점을 이해하는 데 도움이 될 수있는 조금 답변합시다.)

GET 및 POST 쿼리의 차이는 크게 의미합니다. 또한 다른 방법으로 다양한 방법으로 "사용"되어 있으며 값이 어떻게 전송되는지 설명합니다.

얻으십시오 (RFC에 해당)

GET 쿼리를 실행할 때 하나 또는 객체 세트에 대해 서버를 요청합니다. 따라서 클라이언트가 결과를 필터링 할 수 있도록 소위 "쿼리 문자열"URL을 사용할 수 있습니다. 쿼리 문자열은 부분적입니까? 이것은 URI 구문의 일부입니다.

따라서 응용 프로그램 코드의 관점에서 얻다 요청)이 값에 액세스하려면 URI 쿼리의 일부를 확인해야합니다.

키와 값은 URI의 일부입니다. 브라우저 아마도 URI 길이에 한계를 부과하는 것. HTTP 표준은 제한이 없음을 나타냅니다. 그러나이 기사를 작성할 때 대부분의 브라우저는 URI를 제한합니다 (특정 값이 없음). 요청이 있습니다. 서버에 새로운 정보를 보내는 데 사용해야합니다. 특히 큰 문서가 아닙니다. 여기서 게시물을 사용하거나 넣어야합니다.

게시물 (해당 섹션 RFC)

요청 게시물을 실행할 때 클라이언트는 실제로 새로운 것을 보냅니다. 문서 원격 호스트. 따라서, 문자열 의뢰 (의미 론적으로) 의미가 없습니다. 그래서 애플리케이션 코드에서 액세스 할 수없는 이유입니다.

게시물은 조금 더 복잡합니다 (더 유연한) :

POST 요청을 수신하면 항상 "페이로드"또는 http : 메시지 본문의 관점을 기대해야합니다. 메시지 자체의 몸은 아무 것도 없기 때문에 쓸모가 없습니다. 표준 (내가 판단 할 수있는 한. 어쩌면 응용 프로그램 / 옥텟 스트림?) 형식. 본문 형식은 콘텐츠 형 헤더에 의해 결정됩니다. 메소드 \u003d "POST"가있는 HTML 양식 요소를 사용할 때는 일반적으로 응용 프로그램 / x-www-form-urlencoded입니다. 다른 매우 일반적인 유형은 다운로드 파일을 사용하는 경우 다중 그림 / 양식 데이터입니다. 그러나 아마도 아무것도 : 텍스트 / 일반, Application / JSON 이상 또는 사용자 정의 응용 프로그램 / 옥텟 스트림을 사용하십시오.

어쨌든, 애플리케이션에서 처리 할 수없는 콘텐츠 형식으로 POST 요청이 실행되면 상태 코드 415를 반환해야합니다.

대부분의 프로그래밍 언어 (및 / 또는 웹 프레임 워크)는 가장 일반적인 유형 (예 : 응용 프로그램 / x-www-form-urlencoded, multipart / form-data 또는) 응용 프로그램 / JSON). 그래서 그것은 쉽습니다. 사용자 정의 유형은 잠재적으로 조금 더 많은 작업을 필요로합니다.

표준 HTML 코드 된 문서의 예를 사용하여 응용 프로그램은 다음 단계를 수행해야합니다.

  1. 콘텐츠 형식 필드를 읽으십시오
  2. 값이 지원되는 미디어 중 하나가 아니면 상태 코드 415에 대한 답변을 반환합니다.
  3. 그렇지 않으면 메시지 본문에서 값을 디코딩합니다.

다시 말하지만, PHP와 같은 언어 또는 다른 인기있는 언어의 웹 프레임 워크가 이에 대처할 것 같습니다. 예외는 오류 415입니다. 구조는 응용 프로그램이 지원하기 및 / 또는 지원을 선택하는 콘텐츠 유형을 예측할 수 없습니다. 그것은 당신 한테 달려 있어요.

PUT (해당 섹션 RFC)

PUT 요청은 POST 요청과 동일한 방식으로 처리됩니다. 큰 차이점은 POST 요청이 서버가 어떻게 (그리고 전혀있는 경우) 새 자원을 어떻게 결정할 수 있도록 허용해야한다는 것입니다. 역사적으로 (지금 구식 RFC2616에서 그는 요청이 전송 된 "하위 (자바) URI로 새로운 리소스를 만들어야했습니다).

PUT 요청이 "연기 된"자원을 반드시 해야하는 것으로 가정합니다. 이 URI I. 에스. 이 콘텐츠. 그 이상도 이하도 아닌. 아이디어는 그 것이다 고객 창조에 대한 책임이 있습니다 완전한 자원을 "퍼팅"합니다. 서버가이를 수락해야합니다. 그대로 이 URL에서.

결과적으로 POST 요청은 일반적으로 사용되지 않습니다. 바꾸다 기존 자원. 요청을 할 수 있습니다 바꾸다.

노트

또한 원격 제어에 추가 데이터를 보내는 데 사용할 수있는 "경로 매개 변수"도 있습니다. 그러나 그들은 세부 사항에 가지 않을 것이므로 매우 특이합니다. 그러나 참고로, 여기서는 RFC에서 발췌 한 것입니다.

계층 적 경로의 포인트 세그먼트 외에도 경로 세그먼트는 일반화 된 구문에 대한 불투명으로 간주됩니다. 응용 프로그램을 만드는 URI는 세그먼트에서 허용되는 예약 문자로 인해 특정 구성표 또는 분리에 특정한 하위 구성 요소를 구별합니다. 예를 들어, 예약 된 세미콜론 ( ";") 및 ( "\u003d")는 종종이 세그먼트에 적용 할 수있는 매개 변수와 매개 변수 값을 구별하는 데 자주 사용됩니다. 예약 쉼표 기호 ( ",")는 유사한 목적으로 종종 사용됩니다. 예를 들어, 하나의 URI 제조업체는 "이름; v \u003d 1.1 "버전 1.1"name "에 대한 링크를 지정하는 동안 다른 하나는"name, 1.1 "과 같은 세그먼트를 사용하여 지정할 수 있습니다. 매개 변수의 유형은 의미론 특정 구성표를 사용하여 결정할 수 있지만 대부분의 경우 매개 변수의 구문은 URI 송형 알고리즘을 구현하기 위해서는 특정합니다.

브라우저 URL 줄에 직접 입력 할 수 없습니다.

예를 들어 HTTP 헤더를 사용하여 인터넷에서 POST 데이터가 어떻게 전송되는지 알 수 있습니다. 결과는 대략 적절합니다

http://127.0.0.1/pass.php post /pass.php http / 1.1 호스트 : 127.0.0.1 사용자 - 에이전트 : Mozilla / 5.0 (Windows NT 6.1; WOW64; RV : 18.0) Gecko / 20100101 Firefox / 18.0 수락 : 텍스트 / HTML, 응용 프로그램 / XHTML + XML, 응용 프로그램 / XML; Q \u003d 0.9, * / *; Q \u003d 0.8 수락 - 언어 : en; Q \u003d 0.5 수락 - 인코딩 : gzip, dnt dnt : 1 referer : http://127.0.0.1/pass.php 쿠키 : passx \u003d; PHPSESSID \u003d L9HK7MFH0PPQECG8GIALAK6GT5 연결 : 유지 보수 - ALIVE Content-Type : Application / X-WWW 형 - URLEncoded 컨텐츠 - 길이 : 30 username \u003d zurfyx & pass \u003d 암호

그가 어디에 있는지

콘텐츠 - 길이 : 30 username \u003d zurfyx & pass \u003d 암호

값이 게시됩니다.

값은 내용 유형에 지정된 형식으로 쿼리 본문으로 전송됩니다.

일반적으로 콘텐츠 유형 - Application / X-WWW-Form-Urlencoded이므로 쿼리 본문은 쿼리 문자열과 동일한 형식을 사용합니다.

매개 변수 \u003d 값 & 다른 \u003d 다른

양식에서 파일 다운로드를 사용하면 대신 다른 형식이 다른 다중 파트 / 양식 데이터 인코딩을 사용합니다. 그것은 더 어렵지만, 보통 어떻게 보이는지 돌볼 필요가 없으므로 예를 보여주지 않을 것이지만 존재한다는 것을 알면 유용 할 수 있습니다.

POST 요청의 기본 미디어 유형 - Application / X-WWW-Form-Urlencoded. 이것은 쌍 키 값을 인코딩하는 형식입니다. 키를 복제 할 수 있습니다. 각 쌍 키 값은 & & 각 키가 해당 값 기호 \u003d에서 분리됩니다.

예를 들어 :

이름 : John Smith Grade : 19.

다음과 같이 작성 :

Name \u003d John + Smith & Grade \u003d 19.

HTTP 헤더 뒤에 쿼리 본문에 배치됩니다.

질문은 다시 읽습니다. 실제 질문은 CSS 속성의 공급자 접두사와 유사하지 않으며 미래를 확인하고 공급 업체 및 공식 표준을 지원하는 것이 좋습니다. 실제 질문은 URL 쿼리 매개 변수의 이름을 선택할 수 있습니다. 아무도 그들이 누구인지 돌봐야합니다. 그러나 평범한 이름의 일치는 절대적으로 정확하고, 일반, 그리고 옳은 일입니다.

정당화:
이것은 약이다 특정 응용 프로그램의 사용자 정의 제목을위한 개발자 간의 계약 - « 그들의 계정과 관련된 데이터 "문제의 개발자가 서버, 프록시 또는 고객을 사용하기 위해 다른 목적을 가질 수있는 헤더가 제 3자가 구현 해야하는 공급 업체, 표준 또는 프로토콜과 관련이 없습니다. ...에 이러한 이유로 "x-gzip / gzip"및 "x-forward-for-forward-for forward-forue"의 예는 논란의 여지가 있습니다. URL 요청 매개 변수의 이름에 대한 계약과 유사한 개인 API의 컨텍스트와 비슷한 계약에 대한 질문이 있습니다. 이것은 이름 사이의 선호도와 거리의 문제입니다. "x"가없는 프록시 서버 또는 공급자가 지원하는 "X-ClientDataFoo"에 대한 두려움은 분명히 부적절합니다.

접두사 "X-"에는 특별하거나 마술적인 것은 없지만 이것이 사용자 정의 타이틀이라는 것을 이해하는 데 도움이됩니다. 실제로, RFC-6648 및 다른 사람들은 접두사 "X-"의 사용을 방지하는 데 도움이되므로 응용 프로그램, 개인 API, 개인 데이터, 전송 메커니즘이 사이의 충돌로부터 더 잘 고립됩니다. 이름과 소수의 공식 예약 헤더. 그러나 개인적인 취향과 권고 사항은 또 다른 단계이며 예를 들어 "X-ACME-ClientDataFoo"(회사 위젯 "Acme")을 제공합니다.

IMHO IETF 사양은 완전히 다른 사용 옵션을 구분할 수 없기 때문에 OP 질문에 대한 응답에 충분히 구체적이지 않으므로, (a) "Forward-for", Vs. (b) 애플리케이션 개발자는 클라이언트 및 서버에 대한 응용 프로그램에 따라 선을 전송합니다. 스펙트럼은 첫 번째 (a)에만 관련이 있습니다. 여기에있는 질문은 (b) 계약이 있는지 여부입니다. 있다. 이들은 알파벳 순서로 그룹화 매개 변수를 그룹화하고 유형 헤더 (A)의 많은 관련 표준에서 나누는 것을 포함합니다. 접두사 "x"또는 "X-ACME-"의 사용은 (b) 편리하고 합법적이며 (a) 모순되지 않습니다. 판매자가 더 많이 멈추는 것은 "x"를 (a), 더 명확하게 (B)를 사용하지 않습니다.

예:
Google (다양한 표준화 기관에서 약간의 무게를 옮기는) - 오늘날, 오늘날의 사소한 답변 변경 - 현재이 답변을 변환하는 데 참여하는 Apache 모듈의 버전을 지정하기 위해 현재 "x-mod-pageSpeed"를 사용합니다. Google이 "x"가없는 "mod-pageSpeed"를 사용할 수 있거나 / 또는 ietf를 축복하도록 요청 했습니까?

요약:
응용 프로그램 응용 프로그램에서 사용자 정의 HTTP 헤더 (쿠키에 적합한 대체로)를 서버에 사용하는 경우이 헤더는 응용 프로그램의 컨텍스트 외부에서 사용하기 위해 명확하게 사용되지 않고 접두어 "x"또는 "x- Foo- "는 합리적이며 일반적으로 받아 들여진다.

90 년대의 처음부터 브라우저가 웹 페이지를 다운로드 할 수있게 해주는 90 년대의 시작부터 HTTP 네트워크 프로토콜 프로토콜의 주요 측면에 대한 설명이 제공됩니다. 이 기사는 컴퓨터 네트워크로 작업하기 시작하고 네트워크 응용 프로그램의 개발에 참여하기 시작한 사람들을 위해 작성되며, 누군가는 독립적으로 공식 사양을 읽기가 어렵습니다.

http. - 널리 공통된 데이터 전송 프로토콜은 초기에 하이퍼 텍스트 문서 (즉, 다른 문서로의 전환을 구성 할 수있는 링크가 포함될 수있는 문서)를 전송하기위한 것입니다.

HTTP 약어는 AS를 해독합니다 하이퍼 텍스트 전송 프로토콜, "하이퍼 텍스트 전송의 프로토콜". OSI 사양에 따라 HTTP는 적용된 (상위, 7 번째) 레벨의 프로토콜입니다. 현재 버전의 프로토콜 인 HTTP 1.1은 현재 RFC 2616 사양에 설명되어 있습니다.

HTTP 프로토콜에는 클라이언트 서버 데이터 구조를 사용하는 작업이 포함됩니다. 클라이언트 응용 프로그램은 요청을 생성하고 서버 소프트웨어 가이 쿼리를 처리하고 응답을 생성하고 클라이언트로 다시 전송합니다. 그런 다음 클라이언트 응용 프로그램은 동일한 방식으로 처리 될 다른 요청을 계속 보내질 수 있습니다.

전통적으로 HTTP 프로토콜을 사용하여 해결 된 작업은 웹 리소스 (일반적 으로이 웹 브라우저)와 웹 서버에 액세스하는 사용자 응용 프로그램 간의 데이터 교환입니다. 현재 세계 와이드 웹이 보장되는 HTTP 프로토콜 덕분입니다.

HTTP는 SOAP, XML-RPC 및 WebDAV와 같은 다른 응용 프로그램 수준 프로토콜에 대한 정보 전송 프로토콜로서 자주 사용됩니다. 이 경우 HTTP 프로토콜은 "전송"으로 사용됩니다.

많은 소프트웨어 제품의 API는 HTTP를 사용하여 데이터를 전송하는 데 HTTP를 사용하여 데이터 자체와 같이 XML 또는 JSON과 같은 형식을 가질 수 있습니다.

규칙으로서 HTTP 프로토콜을 통한 데이터 전송은 TCP / IP 연결을 통해 수행됩니다. 서버 소프트웨어는 일반적으로 TCP 포트 80을 사용합니다 (그리고 포트가 명시 적으로 지정되어 있지 않으면 열린 연결된 HTTP 연결의 80 번째 포트가 기본적으로 사용됩니다).

HTTP 요청을 보내는 방법은 무엇입니까?

HTTP 프로토콜을 처리하는 가장 쉬운 방법은 수동으로 일부 웹 리소스에 연결하려고합니다. 당신이 당신이 브라우저라고 상상해보십시오. 그리고 당신은 정말로 Anatoly Alizar 기사를 읽고 싶은 사용자가 있습니다.

주소 표시 줄에 다음을 입력한다고 가정하십시오.

http://alizar.habrahabr.ru/

따라서 웹 브라우저가 마음에 드는데, 이제는 Alizar.habrahabr.ru에서 웹 서버에 연결해야합니다.

이렇게하려면 적절한 명령 줄 유틸리티를 사용할 수 있습니다. 예를 들어, 텔넷 :

텔넷 alizar.habrahabr.ru 80.

갑자기 마음을 바꾸면 Ctrl + "]를 눌러 입력 한 다음 입력하면 HTTP 연결을 닫을 수 있습니다. 텔넷 외에도 NC (또는 NCAT)를 시도해 볼 수 있습니다.

서버에 연결 한 후에는 HTTP 요청을 보내야합니다. 그런데 매우 쉽게 HTTP 요청은 두 줄로 구성 될 수 있습니다.

HTTP 쿼리를 구성하려면 시작 줄과 최소한 하나의 헤더를 설정해야합니다. 이것은 필수 항목이며 각 요청에 있어야합니다. 사실은 클라이언트 측에서 도메인 이름을 IP 주소로 전환하는 것입니다. 따라서 TCP 연결을 열면 원격 서버에 연결에 사용 된 주소가 있는지에 대한 정보가 없습니다. 예를 들어 alizar.habrahabr.ru, habrahabr.ru 또는 m.habrahabr.ru 주소 일 수 있습니다.이 모든 경우에 해당 답변이 다를 수 있습니다. 그러나 사실 모든 경우의 네트워크 연결은 노드 212.24.43.44로 열리고 초기에 연결이 열려 있고 서버가 IT에 대해 알리지 않아서 초기에 설정되었습니다. 그래서이 이유입니다. 주소가 호스트 헤더로 전송됩니다.

HTTP 1.1에 대한 쿼리의 시작 (초기) 행은 다음 구성표에 따라 컴파일됩니다.

예를 들어 (이러한 시작 회선은 사이트의 기본 페이지가 요청되었음을 나타낼 수 있음).

물론, 실제로 사용하기 시작할 때 어떤 기술이 훨씬 쉽고 더 쉽고 명확 해지는 것을 잊지 마십시오.

행운과 유익한 학습!

태그 : 태그 추가



주제에 관한 기사 :