## HTTP協議
#### HTTP是Web常見應用的網絡協議,簡稱超文本傳輸協議
http是基于TCP傳輸層實現的,默認的TCP端口為80
http目前使用最多的版本是1.1,最新的版本是2.0,下個版本是3.0
http協議是無狀態的
每次請求都是獨立的,任何兩個請求之間沒有什么必然的聯系
## 多次http請求
客戶端請求網頁多數情況不是一次請求就能成功的,首先是響應html頁面,然后發現HTML頁面還引用的了其他資源。例如css/js/圖片等,還會自動發送http請求這些需要的資源。現在的http版本支持管道機制,可以同時請求和響應多個請求,大大提高了效率
## 基于TCP協議
HTTP協議目的是規定客戶端和服務的數據傳輸的格式和數據交互行為,并不負責數據傳輸的細節。http底層基于TCP實現的,現在的版本默認持久連接,多次的http請求使用一個TCP連接。
## HTTP的組成
為請求和響應兩個部分,請求是指客戶端想服務器發送的消息;響應是指服務器收到信息后想客戶端返回的信息
### URI(統一資源標識符)
**完整uri** :
http:user:pass@host.com:8080/p/a/t/h?query=string#hash
user 用戶名(可選)
pass 對應密碼(可選)
host.com 主機域名地址(或者IP地址)
8080 端口號,默認是80
/P/a/t/h 資源路徑
query=string 參數傳遞,多個參數通過&拼接
hash 錨點
## 請求(Request):
1,請求行 (方法 路徑 協議)
2,請求頭信息 (格式為key=value)
3,請求主體信息 (可選,發送的內容)
請求頭信息與主體信息之間要有一個空行
例子:
POST /index.php http/1.1
host:localhost
content-type:application/x-www-form-urlencoded
content-length:25
name=zhangsan
## 請求行
1,請求方法 GET POST HEAD DELETE PUT TRACE OPTIONS
2,請求路徑 URL的一部分
3,所用協議 目前常用是1.1
## 請求頭信息
1,post請求要注明請求主體的長度
content-length:length
2,服務器要能偶解析到POST數據還需要請求頭包含數據類型
content-type:application/x-www-form-urlencoded
//需要經過url編碼
格式為key:value (鍵值對)
## 請求主體
使用&拼接在一起的key=value鍵值對組成
使用CMD模擬HTTP請求:
1,服務器根目錄創建index.php,內容為 <?php echo "Hello World";
2,打開CMD, telnet localhost 80
3,CTRL+]
4,get /index.php http/1.1
*****
HTTP/1.1 200 OK
Date: Wed, 13 Nov 2019 05:49:40 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9
X-Powered-By: PHP/5.3.29
Connection: close
Content-Type: text/html
Hello World
遺失對主機的連接。
*****
## 響應(Reponse)
響應行(協議 狀態碼 狀態文字)
響應頭信息 (格式為key=value)
空行
主體信息(可能為空)
例子:
HTTP/1.1 200 OK
Content-Type: text/html
content-length:25
hello
## HTTP動詞
1,GET:獲取資源
2,POST:創建資源
3,PUT:修改資源
4,HEAD:獲得報文首部
5,DELETE:刪除文件
6,OPTIONS:詢問支持的方法
7,TRACE:追蹤路徑
8,CONNECT:用于隧道協議連接代理
## HTTP狀態碼與狀態文字
狀態碼:用來反應服務器響應狀態
狀態文字:用來描述狀態碼的
### 5種分類:
1** 信息,服務器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收并處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤
## Content-Type
·內容類型,定義網絡文件的類型和網頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個文件
### application/x-www-form-urlencoded (原生form表單傳輸方式)默認的連接方式
1,數據以key/value 中間用&連接
2,key和value都要用URL編碼
POST http://www.example.com HTTP/1.1
Content-Type:application/x-www-form-urlencoded;charset=utf-8
*****
### multipart/form-data (表單上傳)
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data;boundary=---WebkitFormBoundaryrGKCBY7qhFd3TrwA
---WebkitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition:form-data;name="text"
title
---WebkitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition:form-data;name="file";filename="test.png"
Content-Type:image/png
*****
### application/json (API常用格式)
POST http://www.example.com HTTP/1.1
Content-Type:application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
## text/xml (API常用格式)
POST http://www.example.com HTTP/1.1
Content-Type:text/xml