HTTP協議 學習
首先 附上 官方解釋 和 別人的總結
官方解釋 打開後 第14 Header Field Definitions 將header說的很清楚
http protocol (超文本傳輸協議) 主要用於瀏覽器和web服務器之間的通信. 而且一般明文傳輸 如果需要加密傳輸 可以使用 https
http協議由三部分組成:
請求行 : 方法(post get等) [空格] 請求URI [空格] 版本號 [回車換行]
如: GET /index.html HTTP/1.1
或 POST http://192.168.2.217:8080/index.jsp HTTP/1.1
頭信息(分爲 通用消息頭 | 請求頭 | 實體頭 | 響應頭) 每個頭域由一個域名,冒號(:)和域值三部分組成. 頭信息結束時需要一個空行和實體數據部分分開
實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type(這個很重要)、 Etag、Expires、Last-Modified、extension-header。
Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間;
Accept代表請求頭 – specify certain media types which are acceptable for the response. 就是表名客戶端希望接受的MIME類型.
比如:Accept:text/xml; 代表客戶端希望接受的數據類型是xml類型
Content-Type代表發送端(客戶端|服務器)發送的實體數據的數據類型。
比如:Content-Type:text/html; 代表發送端發送的數據格式是html。二者合起來,
Accept:text/xml;
Content-Type:text/html
即代表希望接受的數據類型是xml格式,本次請求發送的數據的數據格式是html。實體內容 實體數據在請求時,如果以post方式提交時存儲參數,以get方式請求時爲空。在響應時,存儲服務器端反饋的HTML源代碼的數據
Content-Type
類型速查表:http://www.runoob.com/http/http-content-type.html
常見的cotent-Type的值
application/x-www-form-urlencoded
這個在form表單提交的時候 不設置enctype屬性 則會以這種方式提交 如:
POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
首先,Content-Type 被指定爲 application/x-www-form-urlencoded;
其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。multipart/form-data
form上設置enctype=”multipart/form-data” 或 上傳文件時也會 如在js中利用formData上傳視頻或圖片 content-Type爲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="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
首先生成了一個 boundary 用於分割不同的字段(這個在form-data後面一般都有的),爲了避免與正文內容重複,boundary 很長很複雜.
然後 Content-Type 裏指明瞭數據是以 mutipart/form-data 來編碼,本次請求的 boundary 是什麼內容。消息主體裏按照字段個數又分爲多個結構類似的部分,每部分都是以 –boundary 開始,緊接着內容描述信息,然後是回車,最後是字段具體內容(文本或二進制)。如果傳輸的是文件,還要包含文件名和文件類型信息。消息主體最後以 –boundary– 標示結束
application/json
用來告訴服務端消息主體是序列化後的 JSON 字符串.各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什麼麻煩。
以前在提交表單的時候 後臺有的時候獲取不到值 會認爲是 後臺問題 這個時候 可以看看在google瀏覽器F12 下的Network裏查看前臺是否有你發送的數據(在query parameters 或其他 地方)
常用的請求方式是GET和POST.
GET方式:是以實體的方式得到由請求URI所指定資源的信息,如果請求URI只是一個數據產生過程,那麼最終要在響應實體中返回的是處理過程的結果所指向的資源,而不是處理過程的描述。
POST方式:用來向目的服務器發出請求,要求它接受被附在請求後的實體,並把它當作請求隊列中請求URI所指定資源的附加新子項,Post被設計成用統一的方法實現下列功能:
1:對現有資源的解釋;
2:向電子公告欄、新聞組、郵件列表或類似討論組發信息;
3:提交數據塊;
4:通過附加操作來擴展數據庫 。
從上面描述可以看出,Get是向服務器發索取數據的一種請求;而Post是向服務器提交數據的一種請求,要提交的數據位於信息頭後面的實體中。
GET與POST方法有以下區別:
(1) 在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放置在HTML HEADER內提交。
(2) GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。
(3) 安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那麼使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那麼還是使用 post爲好。
這個參考:http://www.blogjava.net/zjusuyong/articles/304788.html
更多 參考:https://blog.csdn.net/J080624/article/details/71104309
http狀態碼
分爲5類
分類 | 分類描述 |
---|---|
1** | 信息,服務器收到請求,需要請求者繼續執行操作 |
2** | 成功,操作被成功接收並處理 |
3** | 重定向,需要進一步的操作以完成請求 |
4** | 客戶端錯誤,請求包含語法錯誤或無法完成請求 |
5** | 服務器錯誤,服務器在處理請求的過程中發生了錯誤 |