更新內容:新增視訊教程 - WEB系統測試、PHP的HTTP協議、okhttp框架解析與應用、走進Requests庫、介面測試基礎入門篇、JMeter之HTTP協議介面效能測試;
更新時間:2017-04-03
為了方便有興趣的朋友一起維護HTTP資源大全,我把資源放到了 Github 上。希望大家多多推薦哈,謝謝大家!
B/S 結構定義
瀏覽器-伺服器(Browser/Server)結構,簡稱B/S結構,與C/S結構不同,其客戶端不需要安裝專門的軟體,只需要瀏覽器即可,瀏覽器通過Web伺服器與資料庫進行互動,可以方便的在不同平臺下工作;伺服器端可採用高效能計算機,並安裝Oracle、Sybase、Informix等大型資料庫。B/S結構簡化了客戶端的工作,它是隨著Internet技術興起而產生的,對C/S技術的改進,但該結構下伺服器端的工作較重,對伺服器的效能要求更高。—— 維基百科
URI (統一資源標誌符)
在電腦術語中,統一資源識別符號(英語:Uniform Resource Identifier,或URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對網路中(一般指全球資訊網)的資源通過特定的協議進行互動操作。URI的最常見的形式是統一資源定位符(URL),經常指定為非正式的網址。更罕見的用法是統一資源名稱(URN),其目的是通過提供一種途徑。用於在特定的名稱空間資源的標識,以補充網址。—— 維基百科
URI 文法
URI文法由URI協議名(例如“
http
”,“ftp
”,“mailto
”或“file
”),一個冒號,和協議對應的內容所構成。特定的協議定義了協議內容的語法和語義,而所有的協議都必須遵循一定的URI文法通用規則,亦即為某些專門目的保留部分特殊字元。—— 維基百科
下面展示了 URI 例子及它們的組成部分:
許可權 路徑
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
協議 使用者資訊 主機名 埠 查詢引數 片段複製程式碼
MIME
MIME(Multipurpose Internet Mail Extensions)多用途網際網路郵件擴充套件型別。是設定某種副檔名的檔案用一種應用程式來開啟的方式型別,當該副檔名檔案被訪問的時候,瀏覽器會自動使用指定應用程式來開啟。多用於指定一些客戶端自定義的檔名,以及一些媒體檔案開啟方式。 —— 百度百科
檔案格式
每個 MIME 型別由兩部分組成,前面是資料的大類別,例如聲音audio、圖象image等,後面定義具體的種類。
常見的 MIME 型別有:
資源名稱 | 字尾 | 型別 |
---|---|---|
超文字標記語言文字 | .html | text/html |
xml文件 | .xml | text/xml |
普通文字 | .txt | text/plain |
PNG影像 | .png | image/png |
PDF文件 | application/pdf |
瞭解更多的 MIME 型別 - 網際網路媒體型別
HTTP 協議
超文字傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是網際網路上應用最為廣泛的一種網路協議。設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源識別符號(Uniform Resource Identifiers,URI)來標識。—— 維基百科
HTTP 協議是基於請求與相應,具體如下圖所示:
HTTP 協議主要特點
- 簡單快速:當客戶端向伺服器端傳送請求時,只是簡單的填寫請求路徑和請求方法即可,然後就可以通過瀏覽器或其他方式將該請求傳送就行了
- 靈活:HTTP 協議允許客戶端和伺服器端傳輸任意型別任意格式的資料物件
- 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線,採用這種方式可以節省傳輸時間。(當今多數伺服器支援Keep-Alive功能,使用伺服器支援長連線,解決無連線的問題)
- 無狀態:無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。即客戶端傳送HTTP請求後,伺服器根據請求,會給我們傳送資料,傳送完後,不會記錄資訊。(使用 cookie 機制可以保持 session,解決無狀態的問題)
HTTP 請求報文
HTTP 請求報文由請求行、請求頭、空行 和 請求體(請求資料) 4 個部分組成,如下圖所示:
請求報文示例
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
Cookie: PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255; BAIDUID=CFA344942EE2E0EE081D8B13B5C847F9:FG=1;複製程式碼
請求行
請求行由請求方法、URL 和 HTTP 協議版本組成,它們之間用空格分開。
GET / HTTP/1.1複製程式碼
請求頭
請求頭由 key-value
對組成,每行一對,key (鍵) 和 value (值)用英文冒號 :
分隔。請求頭通知伺服器有關於客戶端請求的資訊,典型的請求頭有:
- User-Agent:使用者代理資訊 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 ...
- Accept:客戶端可識別的內容型別列表 - text/html,application/xhtml+xml,application/xml
- Accept-Language:客戶端可接受的自然語言 - zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
- Accept-Encoding:客戶端可接受的編碼壓縮格式 - gzip, deflate, sdch, br
- Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機 -
www.baidu.com
- connection:連線方式
- close:告訴WEB伺服器或代理伺服器,在完成本次請求的響應後,斷開連線
- keep-alive:告訴WEB伺服器或代理伺服器。在完成本次請求的響應後,保持連線,以等待後續請求
- Cookie:儲存於客戶端擴充套件欄位,向同一域名的服務端傳送屬於該域的cookie - PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255;
空行
最後一個請求頭之後是一個空行,傳送回車符和換行符,通知伺服器以下不再有請求頭。
請求體
請求資料不在 GET 方法中使用,而是在 POST 方法中使用。與請求資料相關的最常使用的請求頭是 Content-Type和 Content-Length。
HTTP 響應報文
HTTP響應報文由狀態行、響應頭、空行和響應體4 個部分組成,如下圖所示:
響應報文示例
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 30 Mar 2017 12:28:00 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: private
Expires: Thu, 30 Mar 2017 12:27:43 GMT
Set-Cookie: BDSVRTM=0; path=/複製程式碼
狀態行
狀態行格式: HTTP-Version Status-Code Reason-Phrase CRLF
- HTTP-Version - HTTP 協議版本
- Status-Code - 狀態碼
- Reason-Phrase - 狀態碼描述
- CRLF - 回車/換行符
響應頭
響應頭由 key-value
對組成,每行一對,key (鍵) 和 value (值)用英文冒號 :
分隔。響應頭域允許伺服器傳遞不能放在狀態行的附加資訊,這些域主要描述伺服器的資訊和Request-URI進一步的資訊,典型的響應頭有:
- Server:包含處理請求的原始伺服器的軟體資訊
- Date:伺服器日期
- Content-Type:返回的資源型別 (MIME)
- Connection:連線方式
- close:連線已經關閉
- keep-alive:連線已保持,在等待本次連線的後續請求
- Cache-Control:快取控制
- Expires:設定過期時間
- Set-Cookie:設定 Cookie 資訊
空行
最後一個響應頭之後是一個空行,傳送回車符和換行符,通知瀏覽器以下不再有響應頭。
響應體
伺服器返回給瀏覽器的響應資訊,下面是百度首頁的響應體片段:
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg">
<title>百度一下,你就知道</title>
</head>
<body>
...
</body>
</html>複製程式碼
HTTP Methods
HTTP 協議的請求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT、PATCH、HEAD
HTTP 常用的請求方法:
- GET - 獲取資源,使用 URL 方式傳遞引數,大小為 2KB
http://www.example.com/users
- 獲取所有使用者
- POST - 傳輸資源,HTTP Body, 大小預設8M
http://www.example.com/users/a-unique-id
- 新增使用者
- PUT - 資源更新
http://www.example.com/users/a-unique-id
- 更新使用者
- DELETE - 刪除資源
http://www.example.com/users/a-unique-id
- 刪除使用者
HTTP Status Code
狀態程式碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
- 1xx:指示資訊 – 表示請求已接收,繼續處理
- 2xx:成功 – 表示請求已被成功接收
- 3xx:重定向 – 要完成請求必須進行更進一步的操作
- 4xx:客戶端錯誤 – 請求有語法錯誤或請求無法實現
- 5xx:伺服器錯誤 – 伺服器未能實現合法的請求
常見狀態程式碼、狀態描述的說明如下:
- 200 OK:客戶端請求成功
- 204 No Content:沒有新文件,瀏覽器應該繼續顯示原來的文件
- 206 Partial Content:客戶傳送了一個帶有Range頭的GET請求,伺服器完成了它
- 301 Moved Permanently:所請求的頁面已經轉移至新的url
- 302 Found:所請求的頁面已經臨時轉移至新的url
- 304 Not Modified:客戶端有緩衝的文件併發出了一個條件性的請求,伺服器告訴客戶,原來緩衝的文件還可以繼續使用。
- 400 Bad Request:客戶端請求有語法錯誤,不能被伺服器所理解
- 401 Unauthorized:請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden:對被請求頁面的訪問被禁止
- 404 Not Found:請求資源不存在
- 500 Internal Server Error:伺服器發生不可預期的錯誤
- 503 Server Unavailable:請求未完成,伺服器臨時過載或當機,一段時間後可能恢復正常
HTTP Cookie & Session
- 簡書 - 全面解讀 HTTP Cookie
- 簡書 - Cookie 機制
- 阮一峰 - JavaScript 標準參考教程 - Cookie
- segmentfault - 聊一聊 Cookie
- 知乎 - COOKIE和SESSION有什麼區別?
HTTP Cache(快取)
- 在前端效能優化中應用HTTP快取的三部曲
- 徹底弄懂 Http 快取機制 - 基於快取策略三要素分解法
- 鬍子大哈 - 掌握 HTTP 快取——從請求到響應過程的一切(上)
- 鬍子大哈 - 掌握 HTTP 快取——從請求到響應過程的一切(下)
HTTP CORS (跨域資源共享)
HTTPS
- 扒一扒HTTPS網站的內幕
- 簡書 - 九個問題從入門到熟悉HTTPS
- 理解HTTPS為什麼安全前,先看看這些東西
- HTTPS為什麼安全 &分析 HTTPS 連線建立全過程
- HTTPS 免費證照申請教程
- 掘金 - 升級 Https 的那些事
- 簡書 - Android 使用 HTTPS
- 知乎專欄 - iOS開發中的HTTPS
- 簡書 - iOS開發HTTPS實現之信任SSL證照和自簽名證照
HTTP/2
- 掘金 - HTTP 2.0 的那些事
- HTTP/2 發展歷程
- 掘金 - Web 開發者的 HTTP/2 效能優化指南
- 前端開發與 HTTP/2 的羈絆——安利篇
- 簡書 - 讓你的網站升級到HTTP/2
- 簡書 - HTTP/2 流量除錯
- GitBook - http2 講解
HTTP 安全
- segmentfault - 阿里聚安全2016年報
- segmentfault - web許可權驗證方法說明
- HTTP的識別,認證與安全——《HTTP權威指南》系列
- HTTP認證的底層技術簡析與揭祕
- SegmentFault 技術週刊 Vol.12 - Web 安全指南(上)
- SegmentFault 技術週刊 Vol.13 - Web 安全指南(下)
- 簡書 - Web前端攻防,一不小心就中招了
- 如何防範常見的Web攻擊
- 簡書 - Web安全之SQL隱碼攻擊技巧與防範
HTTP 面試
github.io - HTTP 協議 (筆試面試知識整理) - 資料很全面
HTTP 爬蟲文章
Resources
Node.js
Java
- java-spring-mybatis整合實現爬蟲之《今日頭條》搞笑動態圖片爬取
- 掘金 - 重構:抓取一個視訊網站上 2016 年所有電影的下載連結
- 開源中國 - SpringBoot+SpringMVC+MybatisPlus框架整合練習之美女圖片爬蟲---圖文詳細流程
PHP
Python
- 伯樂線上 - Python 爬蟲的工具列表
- 簡書 - Python爬蟲庫-Beautiful Soup的使用
- 漫談Pyspider網路爬蟲的實踐
- 簡書 - 500 行 Python 程式碼構建一個輕量級爬蟲框架
- Python爬蟲一步步抓取房產資訊
- Python爬蟲之模擬知乎登入
- 怎樣藉助Python爬蟲給寶寶起個好名字
- 簡書 - Python爬蟲-用Scrapy框架實現漫畫的爬取
- 簡書 - 使用python抓取美女福利圖片
- 簡書 - Python 福利小爬蟲,爬取今日頭條街拍美女圖
- 掘金 - Python 爬蟲:把廖雪峰的教程轉換成 PDF 電子書
HTTP 資源
文章
- 阮一峰 - HTTP 協議入門
- HTTP 協議詳解
- 扒一扒HTTP的構成
- 跟著 Github 學習 Restful HTTP API 設計
- imweb前端社群 - HTTP1.1與前端效能
- 關於 Web 安全,99% 的網站都忽略了這些
視訊
- 百度傳課 - WEB系統測試 - HTTP協議詳解
- 慕課網 - PHP中的HTTP協議
- Jerry Qu - HTTP系列歸檔文章 (感謝天之驕子推薦)
HTTP 抓包工具及教程
工具
- Browser Develop Tools - 瀏覽器開發者工具
- Fiddler for Windows - Fiddler是一個 HTTP 協議除錯代理工具
- Charles for Mac Mac下HTTP 協議除錯代理工具
- Fiddler-AddOns - Fiddler 外掛地址
- Wireshark - 是一個網路封包分析軟體,網路封包分析軟體的功能是擷取網路封包,並儘可能顯示出最為詳細的網路封包資料
- mitmproxy - 一款可互動式的命令列抓包工具
教程
- Fiddler CertMaker for iOS and Android - HTTPS 證照生成外掛
- 簡書 - HTTPS以及Fiddler抓取HTTPS協議 - APP HTTPS 抓包
- 簡書 - 抓包工具 Fiddler 相關知識總結
- 簡書 - Fiddler 教程
- 簡書 - 抓包工具Wireshark基本介紹和學習TCP三次握手
- TMQ - 從wireshark抓包開始學習https
- 掘金 - 一步一步教你 HTTPS 抓包 (mitmproxy)
Chrome HTTP 外掛
- Proxy SwitchyOmega - 輕鬆快捷地管理和切換多個代理設定
- CORS Toggle - 允許跨域請求
- Postman - 功能超級強大 HTTP Client
HTTP 平臺資源庫
Browser
Node.js
- request - Request is designed to be the simplest way possible to make http calls
- axios- Promise based HTTP client for the browser and node.js
- http-proxy - It is an HTTP programmable proxying library that supports websockets
- superagent - SuperAgent is a small progressive client-side HTTP request library
- morgan - HTTP request logger middleware for node.js
Java
Android
Python
若只使用python3.X, 下面可以不看了, 記住有個urllib的庫就行了
python2.X 有這些庫名可用: urllib, urllib2, urllib3, httplib, httplib2, requests
python3.X 有這些庫名可用: urllib, urllib3, httplib2, requests
兩者都有的urllib3和requests, 它們不是標準庫. urllib3 提供執行緒安全連線池和檔案post支援,與urllib及urllib2的關係不大. requests 自稱HTTP for Humans, 使用更簡潔方便。
詳細資訊請參考 - 開源中國 - python中 urllib, urllib2, httplib, httplib2 幾個庫的區別
HTTP 壓力測試
工具
- LoadRunner
- SoapUI
- Jmeter
- http_load
- webbench
- ab
- siege
教程
HTTP 代理伺服器
產品
- Nginx
- Squid
- Privoxy
- Varnish
- Polipo
- Tinyproxy
- HAProxy
- ATS
文章
- 五大開源 Web 代理伺服器橫評
- 簡書 - 反向代理伺服器比較(Nginx,ATS,Squid等)
- 簡書 - Apache vs Nginx:基於實踐經驗的比較
- 簡書 - 主機、伺服器,代理伺服器,反向代理伺服器理解(自用)
- 簡書- 大型網站架構系列:負載均衡詳解
- 使用squid搭建代理伺服器
- 簡書 - 實戰Nginx筆記
- 簡書 - Nginx Proxy Cache原理和最佳實踐