免费99精品国产自在现线观看_人妻少妇精品视频区性色_丝袜 屁股 在线 国产_无码视频在线免费观看

「HTTP協(xié)議其實(shí)很簡(jiǎn)單.02」理解HTTP協(xié)議的第一行

「HTTP協(xié)議其實(shí)很簡(jiǎn)單.02」理解HTTP協(xié)議的第一行

本篇主題:理解HTTP協(xié)議的第一行

上一篇,講了講怎么去理解協(xié)議,其中的核心點(diǎn)就是用計(jì)算機(jī)的思維模式去思考。這一篇開始正式接觸HTTP協(xié)議的第一行。


古語講:預(yù)先善其事,必先利其器。所以在開始之前,我們需要了解一個(gè)“工具”(一個(gè)軟件的操作)。這個(gè)工具就是去看HTTP協(xié)議內(nèi)容的工具,有的小伙伴可能已經(jīng)想到了,是F12。下面講講工具的打開方法:

  1. 打開瀏覽器(chrome、360、qq隨便什么都可以)
  2. 按下快捷鍵F12。你應(yīng)該會(huì)看到下圖:

「HTTP協(xié)議其實(shí)很簡(jiǎn)單.02」理解HTTP協(xié)議的第一行

3.下面的每一條代表的是一次HTTP請(qǐng)求。點(diǎn)擊可以查看這一次請(qǐng)求的具體內(nèi)容。

工具準(zhǔn)備好了,下面進(jìn)入正題。


我們?cè)O(shè)想一個(gè)打電話的場(chǎng)景,目標(biāo)是找某訊公司/研發(fā)部/XX工作室/開發(fā)小組,而我們只知道某訊公司前臺(tái)的電話(0755-00000000)。

撥通電話,問候之后,我們要告訴對(duì)方,我找研發(fā)部xx工作室開發(fā)小組,順利的情況下前臺(tái)小姐姐會(huì)把電話轉(zhuǎn)給xx工作室開發(fā)小組。

我們梳理一下整個(gè)過程中的重要信息:0755-00000000/研發(fā)部/農(nóng)藥工作室/開發(fā)小組

是不是有點(diǎn)像:pvp.pp.com/web201605/herodetail/116.shtml

電話號(hào)碼就像一個(gè)網(wǎng)址的域名(pvp.pp.com),研發(fā)部/農(nóng)藥工作室 就像web201605/herodetail,開發(fā)小組就像116.shtml

這些信息幫助前臺(tái)小姐姐很精準(zhǔn)的找到我們想找的人,是這次電話場(chǎng)景中必不可少的內(nèi)容。

同樣這也是HTTP協(xié)議中最重要的組成部分,我們來看看他們?cè)贖TTP協(xié)議中是如何體現(xiàn)的。

我們以這個(gè)網(wǎng)址為例來看: https://sale.vmall.com/pseries.html?cid=10618

注意打開瀏覽器后先按下F12,然后再輸入網(wǎng)址,會(huì)在開發(fā)人員工具里看到這樣的界面:

「HTTP協(xié)議其實(shí)很簡(jiǎn)單.02」理解HTTP協(xié)議的第一行

(注意,有很多網(wǎng)址看不到view source,找不到就換個(gè)別的網(wǎng)址)

依次點(diǎn)擊圖中紅框的位置,會(huì)看到下圖:

「HTTP協(xié)議其實(shí)很簡(jiǎn)單.02」理解HTTP協(xié)議的第一行

這就是http協(xié)議的第一行,這一行內(nèi)容告訴服務(wù)器我需要什么。就像打電話告訴前臺(tái)小姐姐我要找誰一樣。

我們可以寫一個(gè)程序代替瀏覽器發(fā)起這一次請(qǐng)求。來完整的看一看一個(gè)完整的HTTP協(xié)議請(qǐng)求和響應(yīng)的內(nèi)容分別是什么。

這次實(shí)驗(yàn)的地址是: www.12371yun.com/news-info.php?cid=2&id=69

下面是模擬瀏覽器的代碼:

import java.io.*;import java.net.InetsocketAddress;import java.net.Socket;import java.net.SocketAddress;public class MyChrome { public static void main(String[] args) throws IOException { String host = “www.12371yun.com”; //定義要訪問哪個(gè)服務(wù)器,就像是要撥打哪個(gè)電話 int port = 80; //定義端口,一般HTTP請(qǐng)求的默認(rèn)商品是80 SocketAddress endpoint = new InetSocketAddress(host, port); //創(chuàng)建地址對(duì)象 // 與服務(wù)端建立連接 Socket socket = new Socket(); //Socket類是TCP/IP請(qǐng)求的核心類。要知道HTTP是建立的TCP/IP基礎(chǔ)上的。 socket.connect(endpoint,2000); //開始連接服務(wù)器,就好比開始撥打電話,參數(shù)2000是超時(shí)時(shí)間,意思是2秒中沒有影響則停止。 // 建立連接后獲得輸出流 OutputStream os = socket.getOutputStream(); //獲得輸出流,用來向服務(wù)器發(fā)送報(bào)文。告訴服務(wù)器我想干什么 //message字符串就是具體的請(qǐng)求報(bào)文 String message = “GET /news-info.php?cid=2&id=69 HTTP/1.1n” //第一行告訴服務(wù)器我的請(qǐng)求方式是GET,需要的資源是/news-info.php,cid=2&id=69是包含了兩個(gè)參數(shù) //Host是廣告服務(wù)器我要訪問的是哪個(gè)域名,服務(wù)器上往往是運(yùn)行著多個(gè)網(wǎng)站,每個(gè)網(wǎng)站可能有不同的域名。雖然在代碼的第一行里有域名, // 但是在連接的時(shí)候域名會(huì)被解析為ip地址。而作為服務(wù)器并不知道你要訪問哪一個(gè)域名。 “Host: www.12371yun.comn” “Connection: keep-aliven” “Pragma: no-cachen” “Cache-Control: no-cachen” “Upgrade-Insecure-Requests: 1n” “User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36n” “Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8n” “Accept-Encoding: gzip, deflaten” “Accept-Language: zh-CN,zh;q=0.9n”; System.out.println(message); os.write(message.getBytes(“UTF-8″));//將報(bào)文數(shù)據(jù)通過輸出流發(fā)送給服務(wù)器 //通過shutdownOutput高速服務(wù)器已經(jīng)發(fā)送完數(shù)據(jù),后續(xù)只能接受數(shù)據(jù) socket.shutdownOutput();//結(jié)束輸出流,就向通話完成后告訴對(duì)方:完畢 InputStream inputStream = socket.getInputStream(); //定義輸出流,準(zhǔn)備接收服務(wù)器返回的報(bào)文 byte[] bytes = new byte[1024]; int len; StringBuilder sb = new StringBuilder(); while ((len = inputStream.read(bytes)) != -1) { //注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8 sb.append(new String(bytes, 0, len,”UTF-8”)); } System.out.println(“Response:rn================”); System.out.println(sb); inputStream.close(); os.close(); socket.close(); }}

以上代碼運(yùn)行后會(huì)在服務(wù)器端輸出如下結(jié)果:

以下為請(qǐng)求報(bào)文:GET http://12371yun.com/news-info.php?cid=2&id=69 HTTP/1.1Host: www.12371yun.comConnection: keep-alivePragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9================以下為響應(yīng)報(bào)文:HTTP/1.1 200 OKDate: Wed, 12 Jun 2019 05:02:48 GMTServer: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/0.9.8t PHP/5.3.10X-Powered-By: PHP/5.3.10Keep-Alive: timeout=5, max=100Connection: Keep-AliveTransfer-Encoding: chunkedContent-Type: text/html;charset=utf-8<!DOCTYPE html><html lang=”en”><head> <meta charset=”UTF-8″ /> <meta name=”viewport” content=”width=device-width, initial-scale=1.0″ /> <meta http-equiv=”X-UA-Compatible” content=”ie=edge” /> <meta name=”renderer” content=”webkit”><title>話端陽 品傳統(tǒng),跟習(xí)近平總書記學(xué)中華文化傳承之道 – 黨建動(dòng)態(tài) – 五心鴻卓,智慧黨建_專注智慧黨務(wù),智慧黨建管理系統(tǒng)研發(fā) – 鴻卓黨建云平臺(tái)</title><meta name=”generator” content=”” /><meta name=”author” content=”” /><meta name=”keywords” content=”智慧黨建,黨建云,智慧黨建系統(tǒng),鴻卓黨建云平臺(tái)” />//以下HTML內(nèi)容省略

我們可以看到請(qǐng)求的報(bào)文內(nèi)容是

GET http://12371yun.com/news-info.php?cid=2&id=69 HTTP/1.1Host: www.12371yun.comConnection: keep-alivePragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9

這和瀏覽器檢測(cè)到的請(qǐng)求內(nèi)容是一樣的:

「HTTP協(xié)議其實(shí)很簡(jiǎn)單.02」理解HTTP協(xié)議的第一行

而響應(yīng)內(nèi)容可以明顯看出是分成了兩部分,第一部分是:

HTTP/1.1 200 OK

Date: Wed, 12 Jun 2019 05:02:48 GMT

Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/0.9.8t PHP/5.3.10

X-Powered-By: PHP/5.3.10

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html;charset=utf-8

這一部分和請(qǐng)求的格式有些相似,一般我們稱之為報(bào)頭。

第二部分是:

<!DOCTYPE html><html lang=”en”><head> <meta charset=”UTF-8″ /> <meta name=”viewport” content=”width=device-width, initial-scale=1.0″ /> <meta http-equiv=”X-UA-Compatible” content=”ie=edge” /> <meta name=”renderer” content=”webkit”><title>話端陽 品傳統(tǒng),跟習(xí)近平總書記學(xué)中華文化傳承之道 – 黨建動(dòng)態(tài) – 五心鴻卓,智慧黨建_專注智慧黨務(wù),智慧黨建管理系統(tǒng)研發(fā) – 鴻卓黨建云平臺(tái)</title><meta name=”generator” content=”” /><meta name=”author” content=”” /><meta name=”keywords” content=”智慧黨建,黨建云,智慧黨建系統(tǒng),鴻卓黨建云平臺(tái)” />//以下HTML內(nèi)容省略

第二部分的內(nèi)容和實(shí)際網(wǎng)頁(yè)的源碼則是一模一樣的。

這就是一次HTTP請(qǐng)求的完整過程,與瀏覽器不同的是我們的程序最后顯示的結(jié)果是源碼,而瀏覽器收到這些響應(yīng)的內(nèi)容則是呈現(xiàn)出一個(gè)好看的頁(yè)面。

另外,細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),F(xiàn)12工具中發(fā)現(xiàn)第一條請(qǐng)求之后會(huì)跟著發(fā)出了N多次請(qǐng)求,這就是瀏覽器在接收到第一個(gè)請(qǐng)求的響應(yīng)之后,根據(jù)源碼的內(nèi)容將所需要的各類資源(js,css,png,jpg等)依次下載,最終將這些內(nèi)容呈現(xiàn)為完整的網(wǎng)頁(yè)。


看到這里我們?cè)倩氐奖酒恼碌闹黝}:第一行。 請(qǐng)求報(bào)文的第一行是:

GET http://12371yun.com/news-info.php?cid=2&id=69 HTTP/1.1

很明顯這里面包含了三部分:

第一部分

GET:表示請(qǐng)求的類型.

HTTP協(xié)議中共定義了八種方法或者叫“動(dòng)作”來表明對(duì)Request-URI指定的資源的不同操作方式,具體介紹如下:

OPTIONS:返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法。也可以利用向Web服務(wù)器發(fā)送’*’的請(qǐng)求來測(cè)試服務(wù)器的功能性。

HEAD:向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。

GET:向特定的資源發(fā)出請(qǐng)求。

POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。

PUT:向指定資源位置上傳其最新內(nèi)容。

DELETE:請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源。

TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。

CONNECT:HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。

雖然HTTP的請(qǐng)求方式有8種,但是我們?cè)趯?shí)際應(yīng)用中常用的也就是get和post,其他請(qǐng)求方式也都可以通過這兩種方式間接的來實(shí)現(xiàn)。

這些請(qǐng)求方式中GET請(qǐng)求的報(bào)文中是只有報(bào)頭,沒有body的。 而POST請(qǐng)求則是有body的。POST請(qǐng)求一般是用在向服務(wù)器提交一些數(shù)據(jù)的時(shí)候使用,例如:登錄、注冊(cè)帳號(hào)、填寫一些數(shù)據(jù)等等。 我們來對(duì)比一下

POST http://127.0.0.1:80/auth/login.do HTTP/1.1Host: 127.0.0.1:80Connection: keep-aliveContent-Length: 66Origin: http://127.0.0.1:80X-Requested-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36Content-Type: application/json;charset=UTF-8Accept: */*{“loginName”:”test”,”loginPwd”:”test”,”verifyCode”:”aujp0e”}

這一段報(bào)文在最后還有一段json格式的數(shù)據(jù)。而GET請(qǐng)求是沒有這最后的內(nèi)容的。

第二部分

http://12371yun.com/news-info.php?cid=2&id=69

這部分表示你要請(qǐng)求服務(wù)器上哪個(gè)資源,可以是一個(gè)html、php、jsp、css、png等等,或者是一個(gè)目錄。

那么如果我們想要請(qǐng)求一個(gè)css的請(qǐng)需要怎么修改這個(gè)報(bào)文呢?很簡(jiǎn)單,只需要把這一部分換成下面這樣就可以了。

GET http://www.12371yun.com/css/index.css HTTP/1.1

實(shí)際上,要完整的呈現(xiàn)出一個(gè)頁(yè)面,只有一次HTTP的請(qǐng)求過程是不夠的,因?yàn)橐粋€(gè)頁(yè)面需要有基本的HTML代碼,還有樣式、js、以及很多圖片,甚至還有從其它站點(diǎn)引入的js代碼庫(kù)等等,這些都需要瀏覽器在得到基本的HTML代碼之后進(jìn)行解析,然后依次將所有的資源請(qǐng)求回來之后才能完整的呈現(xiàn)。

第三部分

HTTP/1.1 這一部分表示http協(xié)議的版本

總結(jié)

這一篇文章我們用一個(gè)控制臺(tái)程序去模擬瀏覽器進(jìn)行了一次請(qǐng)求,通過這個(gè)程序我們可以完整的看到請(qǐng)求和響應(yīng)的報(bào)文內(nèi)容。

這個(gè)程序相當(dāng)于是一個(gè)瀏覽端客戶端,下一篇,我將講解如何去寫一個(gè)服務(wù)器端,然后用瀏覽器去訪問我們的服務(wù)器端,去初步了解一下服務(wù)器端是如何處理HTTP請(qǐng)求的。

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
在線咨詢
分享本頁(yè)
返回頂部