目錄
1.認識URL
2.認識“方法(method)”
2.1GET方法
2.1.1使用Fiddler觀察GET請求
2.1.2 GET請求的特點
2.2 POST方法
2.2.1 使用FIddler觀察POST方法
2.2.2 POST請求的特點
3.認識請求“報頭”(header)
3.1 Host
3.2 Content-Length
3.3 Content-Type
3.4User-Agent(簡稱UA)
3.5 Refer
3.6 Cookie
3.6.1 清除之前的Cookie
3.6.2登錄操作
3.6.3訪問其他頁面
3.6.4理解登錄過程
4.認識請求“正文”(body)
4.1application/x-www-form-urlencoded
4.2multipart/form-data
4.3 application/json
1.認識URL
平時我們俗稱的“網址”其實就是說的URL。(統一資源定位符)。
互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它呢?
URL的詳細規則由因特網標準RFC1738進行了約定(htttps://dataracker.ierf.org/doc/html/rfc173)
一個具體的URL:
1 https://v.bitedu.vip/personInf/student?userId=10000&classId=100
可以看到,在這個URL中有些信息被忽略了。
- https: 協議方案名。常見的有http和https,也有其他的類型。(例如訪問mysql時用的jdbc:mysql)
- user:pass:登錄信息。現在的網站進行身份認證一般不再通過URL進行了。一般都會省略。
- v.bitedy.vip:服務器地址,此處是一個域名,域名會通過DNS系統解析成一個具體的IP地址。(通過ping命令可以看到,v.bitedu.vip的真實IP地址為118.24.113.28)
- 端口號:上面的URL中端口號被忽略了,當端口號省略的時候,瀏覽器會根據協議類型自動決定使用哪個端口,例如http協議默認使用80端口,https默認使用443端口。
- /personInf/student:帶層次的文件路徑。
- userId=10000&classId=100:查詢字符串。本質上是一個鍵值對結構,鍵值對之間使用&分隔,鍵和值之間使用=分隔。
- 片段標識:此處URl中省略了片段標識。片段標識主要用于頁面內跳轉。
使用ping命令查看域名對應的IP地址
- 在開始菜單中輸入cmd,打開命令提示符。
- 在cmd中輸入ping v.bitedu.vip,即可看到域名解析的結果。
URL中可以省略的部分:
協議名,IP地址/域名,端口號,帶層次的文件路徑,查詢字符串,片段標識
2.認識“方法(method)”
方法 | 說明 | 支持的HTTP協議版本 |
---|---|---|
GET | 獲取資源 | 1.0、 1.1 |
POST | 傳輸實體主體 | 1.0、 1.1 |
PUT | 傳輸文件 | 1.0、 1.1 |
HEAD | 獲得報文頭部 | 1.0、 1.1 |
DELETE | 刪除文件 | 1.0、 1.1 |
OPTIONS | 訪問支持的方法 | 1.1 |
TRACE | 追蹤路徑 | 1.1 |
CONNECT | 要求用隧道協議連接代理 | 1.1 |
LINK | 建立和資源之間的聯系 | 1.0 |
UNLINE | 斷開連接關系 | 1.0 |
2.1GET方法
get方法時最常用的HTTP方法,常用于獲取服務器上的某個資源。
在瀏覽器中直接輸入URL,此時瀏覽器就會發送出一個GET請求。
另外,HTML中的LInk,img,script等標簽,也會觸發GET請求。
2.1.1使用Fiddler觀察GET請求
打開Fiddler,訪問搜狗主頁,觀察抓包結果。
從最上面的結果中可以看到:
最上面的
是通過瀏覽器地址欄發送的GET請求。
下面的sogou域名相關的請求,有些是通過html中的link/script/img標簽產生的,例如:
選中其中的一條
觀察請求的詳細結果
GET https://www.sogou.com/ HTTP/1.1
Host: www.sogou.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/w
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: SUID=19AA8B7B6E1CA00A000000005F9A2F76; SUV=1603940214073598; pgv_pvi=266
2.1.2 GET請求的特點
- 首行的第一部分為GET。
- ?URL的query string 可以為空,也可以不為空。
- header部分有若干個鍵值對結構
- body部分為空。
2.2 POST方法
POST方法也是一種常見的方法,多用于提交用戶輸入的數據給服務器(例如登錄頁面)
通過HTML中的form標簽可以構造POST請求,或者使用JavaScript的ajax也可以構造POST請求。
2.2.1 使用FIddler觀察POST方法
在登陸頁面,輸入用戶名,密碼,驗證碼之后,點擊登錄,就可以看到POST請求。‘
1 POST https://v.bitedu.vip/tms/login HTTP/1.1
2 Host: v.bitedu.vip
3 Connection: keep-alive
4 Content-Length: 105
5 sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
6 sec-ch-ua-mobile: ?0
7 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
8 Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
9 Content-Type: application/json;charset=UTF-8
10 Access-Control-Allow-Origin: *
11 Accept: application/json, text/plain, */*
12 Access-Control-Allow-Headers: Content-Type, Content-Length, Authorization,Accep
13 Origin: https://v.bitedu.vip
14 Sec-Fetch-Site: same-origin
15 Sec-Fetch-Mode: cors
16 Sec-Fetch-Dest: empty
17 Referer: https://v.bitedu.vip/login
18 Accept-Encoding: gzip, deflate, br
19 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
20 Cookie: username=123456789; rememberMe=true
21
22{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
2.2.2 POST請求的特點
- 首行的第一部分為POST
- URL的query string 一般為空(也可以不為空)
- header部分有若干個鍵值對結構
- body部分一般不為空。body內的數據格式通過header中的Content1-Type指定。body的長由header中的Content-Length指定
經典面試題:談談GET和POST的區別
- 語義不同:GET一般用于獲取數據,POST一般用于提交數據
- GET的body一般為空,需要傳遞的數據通過query string傳遞,POST的query string 一般為空,要傳遞的數據通過body傳遞。
- GET請求一般是冪等的,POST請求一般是不冪等的。
- GET請求可以被緩存,POST不能被緩存。
3.認識請求“報頭”(header)
header的整體格式也是“鍵值對”結構
每個鍵值對占一行,鍵和值之間使用分號進行分割。
3.1 Host
表示服務器主機的地址和端口。
3.2 Content-Length
表示body中的數據長度
3.3 Content-Type
表示請求中的body中的數據格式
常見選項:
application/x-www-form-urlencodded:from表單提交的數據格式,此時body的格式形如:
1 title=test&content=hello
multipart/form-data:form表單提交的數據格式(在form標簽中加上
enctyped="multipasrt/form-data".通常用于提交圖片/文件。body格式形如:
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3Trw
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
application/json:數據為json格式。body格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
3.4User-Agent(簡稱UA)
表示瀏覽器/操作系統的屬性,形如
1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
其中,Windows NT 10.0;Win64;x64表示操作系統信息
AppleWebKit/537.36(KHTML,like Gecko) Chrome/91.0.4472.77 Safsri/537.36表示瀏覽器信息
3.5 Refer
表示這個頁面是從哪個頁面跳轉過來的,形如
1 https://v.bitedu.vip/login
如果直接在瀏覽器中輸入URL,或者直接通過收藏夾來訪問頁面是沒有Refer的
3.6 Cookie
Cookie存儲了一個字符串,這個數據可能是客戶端(網頁)自行通過JS寫入的,也可能來自于服務器(服務器在HTTP響應的header中通過Set-Cookie字段給瀏覽器返回數據)
往往可以通過這個字段實現“身份標識”的功能
每個不同的域名下都可以有不同的Cookie,不同網站之間的Cookie并不沖突
可以通過抓包觀察頁面登錄的過程:
3.6.1 清除之前的Cookie
在碼云頁面上,點擊url左側的圖標,選擇Cookie
然后移除已經存在的Cookie
3.6.2登錄操作
登錄請求
POST https://gitee.com/login HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 394
Cache-Control: max-age=0
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://gitee.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/w
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://gitee.com/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
encrypt_key=password&utf8=%E2%9C%93&authenticity_token=36ZqO9tglSN6EB6pF6f2Gt%2B
登錄響應
HTTP/1.1 302 Found
Date: Thu, 10 Jun 2021 04:15:58 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=60
Server: nginx
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Location: https://gitee.com/HGtz2222
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Mon, 10 Jun 2041 04:16:00 -0
Set-Cookie: gitee_user=true; path=/
Set-Cookie: gitee-session-n=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllE
X-Request-Id: 77f12d095edc98fab27d040a861f63b1
X-Runtime: 0.166621
Content-Length: 92
<html><body>You are being <a href="https://gitee.com/HGtz2222">redirected</a>.</
可以看到,響應包含了3個Set-Cookie屬性
3.6.3訪問其他頁面
登陸成功之后,此時可以看到后續訪問碼云的其他頁面,請求中就會帶著剛才獲取到的Cookie信息
GET https://gitee.com/HGtz2222 HTTP/1.1
Host: gitee.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/w
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Referer: https://gitee.com/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: oschina_new_user=false; user_locale=zh-CN; yp_riddler_id=1ce4a551-a160-4
3.6.4理解登錄過程
4.認識請求“正文”(body)
正文中的內容格式和header中的Content-Type密切相關
下面可以使用抓包來觀察這幾種情況:
4.1application/x-www-form-urlencoded
抓取碼云上傳頭像請求
POST https://gitee.com/profile/upload_portrait_with_base64 HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 107389
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
Accept: */*
X-CSRF-Token: 6ROfZGr4Y7Qx8td1TuKCnrG8gbODLCSUqUBZSw2b+ac=
X-Requested-With: XMLHttpRequest
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: https://gitee.com
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://gitee.com/HGtz2222
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: oschina_new_user=false; user_locale=zh-CN; yp_riddler_id=1ce4a551-a160-4
avatar=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAPgAAAD4CAYAAADB0Ss
4.2multipart/form-data
POST https://v.bitedu.vip/tms/oss/upload/file HTTP/1.1
Host: v.bitedu.vip
Connection: keep-alive
Content-Length: 293252
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjFiYThjMDM5L
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary8d5Rp4eJgrUSS3
Accept: */*
Origin: https://v.bitedu.vip
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://v.bitedu.vip/personInf/student?userId=665
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: rememberMe=true; username=18691491410; Admin-Token=eyJhbGciOiJIUzUxMiJ9.
------WebKitFormBoundary8d5Rp4eJgrUSS3wT
Content-Disposition: form-data; name="file"; filename="李星亞 Java開發?程師.pdf"
Content-Type: application/pdf
%PDF-1.7
%3
1 0 obj
<</Names <</Dests 4 0 R>> /Outlines 5 0 R /Pages 2 0 R /Type /Catalog>>
endobj
3 0 obj
<</Author ( N v~N ) /Comments () /Company () /CreationDate (D:20201122145133+06'
endobj
13 0 obj
<</AIS false /BM /Normal /CA 1 /Type /ExtGState /ca 1>>
endobj
4.3 application/json
POST https://v.bitedu.vip/tms/login HTTP/1.1
Host: v.bitedu.vip
Connection: keep-alive
Content-Length: 105
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
Content-Type: application/json;charset=UTF-8
Access-Control-Allow-Origin: *
Accept: application/json, text/plain, */*
Access-Control-Allow-Headers: Content-Type, Content-Length, Authorization, Accep
Origin: https://v.bitedu.vip
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://v.bitedu.vip/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: rememberMe=true; username=123456789
{"username":"123456789","password":"xxxx","code":"u58u","uuid":"9bd8e09ea27b48cd