注意:本章整理內容,參考於小坦克的文章資源:https://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html#commonCode
URL詳解
URL(Uniform Resource Locator) 地址用於描述一個網絡上的資源, 基本格式如下: schema://host[:port#]/path/.../[?query-string][#anchor] scheme 指定低層使用的協議(例如:http, https, ftp) host HTTP服務器的IP地址或者域名 port# HTTP服務器的默認端口是80,這種情況下端口號可以省略。如果使用了別的端口,必須指明,例如 http://www.cnblogs.com:8080/ path 訪問資源的路徑 query-string 發送給http服務器的數據 anchor- 錨,這是一種超鏈接,只是頁面內部的超鏈接,如果網頁很長,而且里面的內容分為N個部分,這樣就可以在網頁頂部設置一個錨點, 方便瀏覽者點擊相應錨點,快速到達本頁面相應位置。 URL中,錨點在最右邊,前面有一個字符“#”。 舉例: http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff Schema(協議): http host(域名): www.mywebsite.com path(資源路勁): /sj/test/test.aspx Query String(參數): name=sviergn&x=true Anchor(錨): stuff
http請求方法
http協議中定義了幾種不同的請求命令,這些命令叫做http方法(http method)。
每個http請求報文中都包含一個方法,這個方法告訴服務器要執行什么動作。
一個URL地址用於描述一個網絡上的資源,而http中的get、post、put、delete就對應着這個資源的查、改、增、刪4個操作。
最常見的是get和post:
get一般用於獲取/查詢資源信息;
post一般用於更新資源信息;
Http協議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE.。
一個URL地址用於描述一個網絡上的資源,
而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操作。
我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息.
5種常見的http方法包括:
get:請求指定的頁面信息,並返回實體主體;
head:類似於get請求,只不過返回的響應中,沒有具體的內容,用於獲取報頭;
post:向指定資源提交數據進行請求(例如:提交表單或者上傳文件),數據被包含在請求體中。
post請求可能會導致新的資源的建立或對已有的資源的修改;
put:從客戶端向服務器傳送的數據,取代指定文檔的內容;
delete:請求服務器刪除指定的頁面;
get方法:用戶獲取資源,常用於向服務器查詢某些信息,一般打開網頁都是用get方法,因為要從web服務器獲取信息。
帶參數的get方法:
瀏覽器可以在get方法中,把數據傳遞給服務器,數據放在URL的問號(?)后面。
將查詢字符串參數追加到URL末尾,一遍將信息發送給服務器。這種方式叫做查詢字符串,或者叫query string。
例如:百度搜索URL如下:
下面為get方法,並帶有參數 GET https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=sitehao123&wd=%E4%B8%AD%E5%9B %BD&rsv_pq=ee5e88db00155eb1&rsv_t=9b46NVmtUvhHk8NuPqytTgFcpScJZfmNOSxhFBaAu5rlcjCsQ9PfON8N98xNepLuQQ&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=10&rsv_sug1=1&rsv_sug7=00 1&prefixsug=%25E4%25B8%25AD%25E5%259B%25BD&rsp=8&rsv_sug9=es_0_1&inputT=10643&rsv_sug4=12203&rsv_sug=9 HTTP/1.1 Host: www.baidu.com Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 Sec-Fetch-User: ?1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Referer: https://www.baidu.com/?tn=sitehao123&H123Tmp=nunew11 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: BIDUPSID=1655D38E3EB9FAF984C3D838C40375AC; PSTM=1564563068; BD_UPN=12314553; BAIDUID=8B7CDF0DBB1D8B4D8DC4288AE32C655B:FG=1; ispeed_lsm=2; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDSFRCVID=7AKsJeCCxG3e2tjwgnO1j79umibdsgZhD6873J; H_BDCLCKID_SF=tbAD_CKKf-3bfTuGDJOqKn0thxtX2bjMfbTf_p7F5l8-hCQXDPjf-n-shxTw- lQCMJ7PBfQaKqcxOKQphPbm5nIXQ48qbpbjb2oiLInN3KJm_UK9bT3v5Duy-tQ42-biW2tH2Mbdax7P_IoG2Mn8M4bb3qOpBtQmJeTxoUJ25DnJhhCGe6D2e5Q3jNLsbtQb26r-3--8-bTVHRDk5-Qo- 4_eqxby26Pf0m3eaJ5n0-nnhnK45-6bbPCgDfCfqRQL2CrbQb3u2p--bK0Ry66jK4JKDG0tJ6OP; H_PS_PSSID=1469_21080_30211_30071_26350; H_PS_645EC=881dEMXJjSRsjFsceTvx5SWR2G %2FilqMyfp6iGiw%2BDfeUUG0wTEM81HCuM8v1K4C3CQ; delPer=0; BD_CK_SAM=1; PSINO=5; BDSVRTM=113 注意:瀏覽器可以在get方法中把數據傳給服務器,數據放在URL的?后面; 百度搜索中,查詢字符串以名=值這樣的形式出現,多個名值之間用&分隔開;
在fiddler中,使用webforms選項卡可以清楚的看到get方法中的字符串查詢參數:
post方法
post方法通常用來把表單中填好的數據發送給服務器。
post方法,數據放在body中,不會放在url中。
GET和POST的區別
GET和POST的區別: 1. GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456 。 POST方法是把提交的數據放在HTTP包的Body中. 2. GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制. 3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。 4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上, 如果頁面可以被緩存或者其他人可以訪問這台機器,就可以從歷史記錄獲得該用戶的賬號和密碼.
===================================================================================================================================
http狀態碼
http狀態碼: 每個http響應報文,都會攜帶一個狀態碼,用於告訴客戶端請求是否成功。狀態碼是一個3位數字的代碼。 http狀態碼存在於http的響應報文中,其作用是web服務器告訴客戶端發生了什么事。 http響應報文中的第一行,由http協議版本號、狀態碼、狀態消息3部分組成。 ------------------------------------------------------------------------------------------------------------ Response 消息中的第一行叫做狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。 狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response. HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別 1XX:提示信息 - 表示請求已被成功接收,繼續處理 2XX:成功 - 表示請求已被成功接收,理解,接受 3XX:重定向 - 要完成請求必須進行更進一步的處理 4XX:客戶端錯誤 - 請求有語法錯誤或請求無法實現 5XX:服務器端錯誤 - 服務器未能實現合法的請求
常見的狀態碼
一般人只需要了解以下常見的狀態碼就夠了, 如果你想了解更多, 請繼續往下看。
200 OK 服務器成功處理了請求(這個是我們見到最多的) |
301/302 Moved Permanently(重定向)請求的URL已移走。Response中應該包含一個Location URL, 說明資源現在所處的位置 |
304 Not Modified(未修改)客戶的緩存資源是最新的, 要客戶端使用緩存 |
404 Not Found 未找到資源 |
501 Internal Server Error服務器遇到一個錯誤,使其無法對請求提供服務 |
其它詳細的狀態碼,詳細見其它參考博客。
2XX 成功狀態碼
客戶端發起請求時, 這些請求通常都是成功的。服務器有一組用來表示成功的狀態碼,分別對應於不同類型的請求。
。
狀態碼:204(no content,沒有內容):返回的響應中,只有一些header和一個狀態行,沒有實體的主題內容(沒有響應body)。
作用如下:
(1)在不獲取資源的情況下,了解資源的情況(比如判斷其類型)
(2)通過查看http響應中的狀態碼,查看某個對象是否存在。
(3)通過查看header測試資源是否被修改。
實例:先打開Fiddler, 然后啟動瀏覽器訪問ditu.google.cn, 你會捕獲到很多204
狀態碼:206(partial content):代表服務器已經成功處理了部分GET請求(只有發送GET 方法的request, web服務器才可能返回206)
應用場景:
1. FlashGet, 迅雷或者HTTP下載工具都是使用206狀態碼來實現斷點續傳
2. 將以個大文檔分解為多個下載段同時下載 比如,在線看視頻
實例: 一些流媒體技術比如在線視頻,可以邊看邊下載。 就是使用206來實現的。
打開Fiddler, 然后用瀏覽器打開“搜狐視頻中的綠箭俠” http://tv.sohu.com/20121011/n354681393.shtml 然后你在Fiddler中就能看到一堆的206
1. 瀏覽器發送一個Get 方法的request. header中包含 Range: bytes=5303296-5336063. (意思就是請求得到5303296-5336063這個范圍的數據)。
2. Web服務器返回一個206 的Response. header中包含Content-Range: bytes 5303296-5336063/12129376(表明這次返回的內容范圍)
3XX 重定向狀態碼
重定向狀態碼用來告訴瀏覽器客戶端,它們訪問的資源已被移動, Web服務器發送一個重定向狀態碼和一個可選的Location Header, 告訴客戶端新的資源地址在哪。
瀏覽器客戶端會自動用Location中提供的地址,重新發送新的Request。 這個過程對用戶來說是透明的。
301和302 非常相似, 一個是永久轉移,一個是臨時轉移。
(SEO中,搜索引擎如果碰到301, 比如網頁A用301重定向到網頁B,搜索引擎可以肯定網頁A永久性改變地址,就會把網頁B當做唯一有效目標)
302,303,307 是一樣。 這是因為302是HTTP 1.0定義的, HTTP1.1中使用303,307. 同時又保留了302. (但在現實中,我們還是用302,我是沒見過303和307)
所以這一節, 我們只需要掌握302, 304 就可以了。
狀態碼:301(moved permanently):表示網頁已經永久性的轉移到另外一個地址。
請求的URL已移走。Response中應該包含一個Location URL, 說明資源現在所處的位置
例如: 1. 瀏覽器客戶端訪問 http://map.google.cn
2. Web服務器返回Response 301,Location=http://titu.google.cn (告訴客戶端我們的資源位於這里, )
3. 瀏覽器客戶端會自動再發送一個Request 去訪問http://titu.google.cn
狀態碼:302(found):當我們訪問一個url的時候,服務器要我們訪問另外一個資源,這個時候瀏覽器會繼續發一個http,請求訪問新的資源。
重定向,新的URL會在response 中的Location中返回,瀏覽器將會自動使用新的URL發出新的Request
例如在IE中輸入, http://www.google.com. HTTP服務器會返回302, IE取到Response中Location header的新URL, 又重新發送了一個Request.
301和302在語法上是一模一樣的,都是在location中返回新的url。區別在於: (1)、301表示舊地址的資源已經被永久的移除了(這個資源不可訪問了),
搜索引擎會把權重算到新的地址; (2)、302表示舊地址的資源還在(仍然可以訪問),這個重定向只是臨時的從舊地址跳轉到新地址,
搜索引擎會把權重算到舊的地址;
狀態碼:304 (Not Modified):代表上次的文檔已經被緩存了, 還可以繼續使用
例如打開博客園首頁, 發現很多Response 的status code 都是304
提示: 如果你不想使用本地緩存可以用Ctrl+F5 強制刷新頁面
4XX客戶端錯誤狀態碼
有時客戶端會發送一些服務器無法處理的東西,比如格式錯誤的Request, 或者最常見的是, 請求一個不存在的URL。
400 Bad Request(壞請求)
發送的Request中的數據有錯誤(比如:表單有錯誤,Cookie有錯誤), 這個我們也經常見到。
401(unauthorized)(未授權錯誤)
有些網頁采用的是http基本認證(basic authentication),所以需要在http請求中帶上authorization header,否則服務器會返回狀態碼401
403 Forbidden(禁止)
Web客戶端發送的請求被Web服務器拒絕了, 如果服務器想說明為什么拒絕請求,可以包含實體的主體部分來對原因進行描述。但這個狀態碼通常是服務器不想說明拒絕原因。
訪問下面的URL, 會被服務器拒絕. 並且返回403狀態碼
http://t2.baidu.com/it/u=1791561788,200960144&fm=0&gp=0.jpg
404 Page not Found (請求的資源不存在)
這個大家都懂的, 值得一提的是: 騰訊把404頁面做成了“尋找被拐兒童”
405 Method Not Allowed(不允許使用的方法)
405是指Web服務器不支持Request中的方法。
我個人認為狀態碼405Method Not Allowed和501 Not Implemented 是一樣的意思。都是不支持Request的方法。 (目前我還不知道這兩個的區別)
實例: 發送一個是trace方法的Request 給www.google.com
411 Length Required(要求長度指示)
服務器要求在Request中包含Content-Length。
當瀏覽器使用Post方法,發送數據給Web服務器時, 必須要有Content-Length。這樣Web服務器才知道你要發送多少數據,否則Web服務器會返回411狀態碼
實例: 發送一個Post方法的Request 給www.google.com. Request中沒有Content-Length
413 Request Entity Too Large(請求實體太大)
作用:客戶端發送的實體主體部分比服務器能夠或者希望處理的要大。 一般情況下我們看不到這個狀態碼。 因為瀏覽器不會發送太大的數據給網站,但是機器人可能會。
實例: 用post方法發送一個大文件(100MB以上)給www.google.com
414 Request URI Too Long(請求URI太長)
就是說Request URI太長, 一般瀏覽器本身對URI的長度就會有限制,所以不會發送URI很長的Request. 我們平常是根本看不到414錯誤的。 但是機器人可以發送很長URI。
例如:我們用Fiddler Composer發送一個很長的URI給Google, 比如 "www.google.com?q=asdfasdasf.." q=后面的參數很長。 就可以看到414了
5XX服務器錯誤狀態碼
有時候客戶端發送了一條有效Request, Web服務器自身卻出錯了。 可能是Web服務器運行出錯了, 或者網站都掛了。 5XX就是用來描述服務器錯誤的。
500 Internal Server Error(內部服務器錯誤)
這個太常見了, 我們開發網站的時候,當我們的程序出錯了時,就會返回500錯誤。
實例:ASP.NET 程序出錯
501 Not Implemented(未實現)
客戶端發起的請求超出服務器的能力范圍(比如,使用了服務器不支持的請求方法)時,使用此狀態碼)。 一般的Web服務器只支持GET和POST方法。
實例: 使用Fiddler Composer 給www.qq.com, 發送一個OPTIONS 方法的Request. 服務器就能返回501了。
502 Bad Gateway(網關故障)
代理使用的服務器遇到了上游的無效響應。
Fiddler本身就是代理服務器。 當我們訪問www.facebook.com,這網站被我們天朝屏蔽了。 所以我們可以得到502
503(server unavailable)(服務器暫時不可用)
由於服務器維護或者過載,服務器當前無法處理請求;這個狀況是臨時的,並且將在一段時間以后恢復。
505 HTTP Version Not Supported(不支持的HTTP版本)
表示Web服務器不支持此HTTP協議的版本。
眾所周知我們現在使用的HTTP協議版本是HTTP/1.1, 如果我們發送一個HTTP/2.0 的request 給博客園, 博客園肯定不能支持HTTP/2.0,所以會返回505
想要發送這樣的request, 可以使用Fiddler工具中的Composer來發送自定義的request, 如下圖。