服務端編程專欄正在持續更新 敬請關注:)
文章目錄
前言 ´・ᴗ・`
-
前面我們大體介紹了web是怎麼工作的 點擊網頁後發生的種種事情 這裏讓我們深入瞭解HTTP request 和 服務器response
-
本文可以幫你知曉…
- request method 請求方法有哪些? 一般用來幹嘛?
- HTTP request(尤其是header)的結構
- response (尤其是header)的結構
- query string 請求字符串是什麼
- 常見的狀態碼有哪些 302與200的區別
- POST的request內容和GET的request內容有啥區別, response呢?
HTTP request
我們知道,web瀏覽器與web服務器之間的語言就是HTTP。當你點擊一個web頁面,提交表單 或者 運行搜索引擎,瀏覽器都會給相應的服務器發送一個HTTP request(當然需要域名解析的時候 會先給DNS解析服務器發送hTTP請求)
請求其實就是一個數據包 包括
- 請求資源的URL(Uniform Resource Locator,統一資源定位符) 地址
在WWW萬維網上 所有的資源都有自己的地址 就是URL 好像我們各家各戶的等級地址一般 - 請求方法(request method)
- 其他附加信息(additional info)
請求方法 request method
一個HTTP請求僅有一個請求方法 它規定了本次請求的套路是怎麼樣的:
- GET: 請求獲取一個具體的資源 比如html網頁 或者一張圖片
- POST: 你向服務器提交submit一些東西 比如你登錄時輸入的賬號密碼
- HEAD: 找某一資源的metadata 元數據 簡化版的GET —— 不要body主體 只需要拿到header的請求方法
- PUT: 上傳資源(也可以更新已有資源 本質都是上傳文件)
- DELETE: 刪資源
- TRACE, OPTIONS, CONNECT, PATCH: 這些太罕見或者太高級 這裏不提了
附加信息 addtional info
這個附加信息的位置,有三種一般說來, 我們分別討論:
-
URL參數 對於GET方法 瀏覽器會把附加信息加密編碼 最終放到URL地址裏面,稱爲URL參數,方法是加鍵值對,往往?分割網站網址和我們的附加信息 在這裏的附加信息又稱爲 請求字符串query string
什麼是請求字符串呢?我們看另一個例子:
GET https://developer.mozilla.org/en-US/search?q=client+server+overview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev HTTP/1.1
這是GET方法下的URL,包含了很多信息:- 請求方式GET
- 目標資源的URL: (/en-US/search).
- URL的參數(URL parameter) 也就是請求字符串 (q=client%2Bserver%2Boverview&topic=apps&topic=html&topic=css&topic=js&topic=api&topic=webdev).
- 目標網站 : (developer.mozilla.org).
- 最後講明HTTP的協議版本:(HTTP/1.1).
那麼 請求字符串其實是一個個鍵值對構成的 用&隔開 你可以把上面這個拆成:
q=client%2Bserver%2Boverview
topic=apps
topic=html
topic=css
topic=js
topic=api
topic=webdev -
post request body
對於POST方法 附加信息在body主體裏面 當然也是經過編碼後的產物 -
客戶端cookie (client-side cookies)
response 狀態碼
當request發出以後 服務器必須應答response
應答內容包含一個狀態碼( HTTP Response status code)
歸納如下:
- Informational responses (100–199)
臨時的響應 這個不用管 一般用不到 - Successful responses (200–299)
意思你訪問成功了 少年 - Redirects (300–399)
一般就是重定向 只不過重定向的原因各有不同 - Client errors (400–499)
你客戶端的鍋(也可能服務器拒絕你 給你甩鍋) - Server errors (500–599)
服務器的鍋
其中,常見的狀態碼有:
- 200 OK
成功訪問 - 302 FOUND
找到了 只不過重定向了 就好像你找你朋友(要找的資源),問你朋友的鄰居說,這個地址住着的人在哪?鄰居說你朋友換地方住了(新的地址),讓你去新地方找你朋友(重定向) - 404 NOT FOUND
找不到 服務器說找不到你想要的(其實也可能是服務器拒絕你訪問 給你發好人卡) - 503
服務器炸了
如果GET方法成功的話 response除了包含狀態碼 還包含有請求到的資源requested resources
假設我們請求的是html頁面
當頁面中引用了.js .css的時候 html渲染(render)過程中,他會很機智的繼續分發(distribute)HTTP請求 去下載這些.js .css 然後繼續完成整個網頁page的渲染.
GET request結構解析
GET請求到的資源 會包含一個請求頭request header 和 響應頭response header
自然請求頭包含有 有關請求的重要信息 響應頭也是如此 還有類似html header 網頁的head部分也是包含整個網頁的重要信息 header一直都很重要
我們可以打開任意一個網頁 比如百度主頁www.baidu.com
然後F12 到Network 如之前所說 我們可以看到一個個加載的文件
當然他們都是通過HTTP請求才能下載的 意味着都有request和response 我們可以通過chrome查看:
Request URL: https://www.baidu.com/favicon.ico
Request Method: GET
Status Code: 200 OK
Remote Address: 182.61.200.6:443
Referrer Policy: unsafe-url
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: PSTM=1577329563; BAIDUID=E4F5FD18668074E8DED01C50FE983606:FG=1; BIDUPSID=0EA9375836717AE87969593B47FA41AD; BD_UPN=12314753; H_PS_PSSID=1442_21082; delPer=0; BD_CK_SAM=1; ZD_ENTRY=baidu; BD_HOME=0; PSINO=1; H_PS_645EC=657deZ3tp922DDbYImhUWOimcayt%2FhGQXfZibMkonRRi4b2vgCLKH7hyAz4
Host: www.baidu.com
Pragma: no-cache
Referer: https://www.baidu.com/
Sec-Fetch-Dest: image
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36
這個部分也是爬蟲將會常常涉及到的 爬蟲經常需要仿造表單 主要是request header部分
好了 我們來看看每個部分大概啥意思:
前三行:
- Request URL: https://www.baidu.com/favicon.ico
這就是請求資源的資源地址 我們可以看到是在百度服務器下的根目錄有個faviconi.ico
- Request Method: GET 請求方式
- Status Code: 200 OK HTPP狀態碼 可見是正常訪問的
當然 這個資源是不需要Query string 請求字符串的
其它內容包含有對服務器返回資源的限定:
- Accept: image/webp,image/apng,image/,/*;q=0.8
限定返回圖片 格式指定爲webp png等 - Accept-Encoding: gzip, deflate, br
限定壓縮格式 或者說可以接受的壓縮格式是gzip - Accept-Language: zh-CN,zh;q=0.9
限定接收語言 中文
剩下的一些信息也至關重要 比如:
- Cache-Control: no-cache
無緩存模式 - Connection: keep-alive
連接是一直alive的 不是斷斷續續的那種(這個得學socket才懂) - Cookie: PSTM=1577329563; BAIDUID=E4F5FD18668074E8DED01C50FE983606:FG=1;
cookie我們常常聽說 其實就是存一些客戶端的信息(可能包含賬號密碼 所以說不安全) - Host: www.baidu.com
主機 - Referer: https://www.baidu.com/
發request的地址 也就是請求這個圖片的網頁地址(我們說過 渲染的時候html會分發其他http請求來下載相關的文件譬如js css還有媒體文件如圖片 音頻等) - User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36
說明你的瀏覽器信息 這個是爬蟲最簡單也是最根本的——仿造UA 讓你的爬蟲 被服務器誤認爲是用瀏覽器的普通用戶 然後允許你訪問資源
另外 這裏寫的有些內容content可能有時候放到了response header裏面 不用在意
GET response解析
前面說了request header 這裏說說response
現在一般查到的可能是這個樣子的header:
有3各部分 其實General部分包含了response header的內容(比如status code)當然我們一起看的 問題不大
一般教科書式的response header長這樣:
HTTP/1.1 200 OK
Server: Apache
X-Backend-Server: developer1.webapp.scl3.mozilla.com
Vary: Accept,Cookie, Accept-Encoding
Content-Type: text/html; charset=utf-8
Date: Wed, 07 Sep 2016 00:11:31 GMT
Keep-Alive: timeout=5, max=999
Connection: Keep-Alive
X-Frame-Options: DENY
Allow: GET
X-Cache-Info: caching
Content-Length: 41823
- HTTP/1.1 200 OK 狀態碼200 成功
- Server: Apache apache服務器
- Content-Type: text/html; charset=utf-8
返回內容說明:type text\html 然後字符集是utf-8 - Date: Wed, 07 Sep 2016 00:11:31 GMT 標準GMT時間
- Keep-Alive: timeout=5, max=999 keep-alive 具體參數 timeout等
-Connection: Keep-Alive - X-Frame-Options: DENY 禁止使用iframe嵌套
- Allow: GET 允許GET獲取資源
- X-Cache-Info: caching 允許緩存
- Content-Length: 41823 返回長度
猜得出來 這是網頁html的response header
POST request/response 解析
POST常常發生在你提交**表單(form)**的時候
比如你註冊CSDN 或者在政府的網站 填寫免費領取口罩的個人信息啥的
這裏簡單起見 兩個放在一起講:
request header (教科書 實際情況也差不多)
POST https://developer.mozilla.org/en-US/profiles/hamishwillee/edit HTTP/1.1
Host: developer.mozilla.org
Connection: keep-alive
Content-Length: 432
Pragma: no-cache
Cache-Control: no-cache
Origin: https://developer.mozilla.org
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://developer.mozilla.org/en-US/profiles/hamishwillee/edit
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,es;q=0.6
Cookie: sessionid=6ynxs23n521lu21b1t136rhbv7ezngie; _gat=1; csrftoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT; dwf_section_edit=False; dwf_sg_task_completion=False; _ga=GA1.2.1688886003.1471911953; ffo=true
除了header 請求主體body內容如下:
csrfmiddlewaretoken=zIPUJsAZv6pcgCBJSCj1zU6pQZbfMUAT&user-username=hamishwillee&user-fullname=Hamish+Willee&user-title=&user-organization=&user-location=Australia&user-locale=en-US&user-timezone=Australia%2FMelbourne&user-irc_nickname=&user-interests=&user-expertise=&user-twitter_url=&user-stackoverflow_url=&user-linkedin_url=&user-mozillians_url=&user-facebook_url=
我們明顯看到GET 和POST的不同——POST的URL是不包含query string的
其他的都差不多的
有人會說: 我們拿百度首頁測試發現貌似並不是這樣啊
——其實是因爲首頁並沒有任何查詢字段 你沒輸入什麼來搜索啊
如果你輸入csdn 回車 搜索 就發現:
另外 在請求主體我們可以拆解出一個個鍵值對——未加密的
這就是表單內容 當然關鍵的內容是需要解密的
POST的response header也和GET差不多:
HTTP/1.1 302 FOUND
Server: Apache
X-Backend-Server: developer3.webapp.scl3.mozilla.com
Vary: Cookie
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
Date: Wed, 07 Sep 2016 00:38:13 GMT
Location: https://developer.mozilla.org/en-US/profiles/hamishwillee
Keep-Alive: timeout=5, max=1000
Connection: Keep-Alive
X-Frame-Options: DENY
X-Cache-Info: not cacheable; request wasn't a GET or HEAD
Content-Length: 0
有點不太相同的:
- status code = 302 FOUND
其實同200一樣是可用的——只不過多了重定向redirection - 爲啥有重定向呢?
假設你登錄自己的主頁 POST提交·你的賬號密碼 下一步就應當跳轉(重定向)到你的個人主頁了吧 - 重定向去哪個網頁呢?Location告訴你了
總結 ´◡`
這裏我們講述了有關response和request的相關信息 是基礎的基礎——無論是建站還是爬蟲:)
下一站我們將討論靜態與動態網站的優劣 還有一些細節。其實之前講到過一丁點,所以學起來問題不大
下面我們來了解一個有關動態網站的重要概念: AJAX
傳送:服務端編程(五)- 背景知識 - AJAX