WEB必知必會--圖解Http(上)

来源:https://www.cnblogs.com/aichisuancaideyu/archive/2018/03/16/8578194.html
-Advertisement-
Play Games

本篇總結關於http的相關知識,主要內容參考如下導圖: 主要講解的內容有: 1 URL與URI的區別。 2 請求報文與相應報文的內容。 3 GET與POST的區別。 4 http的cookie、持久化、管道化、多部分對象集合、範圍請求等。 後續會更新http其他的相關知識。 關鍵詞概念 平時會經常接 ...


本篇總結關於http的相關知識,主要內容參考如下導圖:

主要講解的內容有:

  1 URL與URI的區別。

  2 請求報文與相應報文的內容。

  3 GET與POST的區別。

  4 http的cookie、持久化、管道化、多部分對象集合、範圍請求等。

 後續會更新http其他的相關知識。

  關鍵詞概念

  平時會經常接觸到URL,他就是我們訪問web的一個字元串地址,那麼URI是什麼呢?他們是什麼關係呢?

  先看看官方的解釋:

  URL:uniform resource location 統一資源定位符

  URI:uniform resource identifier 統一資源標識符

  這也就是說,URI是一種資源的標識;而URL也是一種URI,也是一種資源的標識,但它也指明瞭如何定位Locate到這個資源。

  URI是一種抽象的資源標識,既可以是絕對的,也可以是相對的。但是URL是一種URI,它指明瞭定位的信息,必須是絕對的。

  而我們平時所說的相對地址,僅僅是相對於另一個絕對地址而言。

 

  RFC:reqeust for comments 征求修正意見書

  RFC素有網路知識聖經之稱,規定了網路中協議的基本內容。因此許多的不同系統的應用程式才可以互相訪問。

報文格式

  首先報文的格式如下:

  其中空行用於區分報文首部和報文主體內容,是由一個回車符和一個換行符組成。

  無論是請求報文還是響應報文都需要有報文首部,當然報文主體有的請求報文是沒有的。

  一般來說,請求報文的格式如下:

 其中請求首部還包括其他的內容,不一一列舉了。

  響應報文格式如下:

  下麵我們看一下在不同的瀏覽器中http報文的內容:

  上圖是chrome中http的內容,其中request headers描述了請求報文頭部的內容,response headers描述了響應報文頭部的內容。

  其中最長使用的屬性是:

  1 URL, 即http訪問的地址

  2 request method, 報文的請求方式

  3 status code, 狀態碼以及狀態短語

  4 Accept Encoding, 內容編碼

  5 Connection, 連接方式

  6 Cookie, 添加的cookie內容

  7 Host, 目標主機

  8 User-Agent, 客戶端瀏覽器的相關信息

  9 Set-Cookie, 指定想要在Cookie中保存的內容

  常用的屬性內容就是上面這些。

  在IE中捕獲到的顯示方式不同,但是內容都是相同的:

  http請求方式

  如何發送http有很多種方式,但是最常用的就是POST和GET。

  其他的有些出於安全性的考慮一般都不建議使用。那麼POST與GET有什麼區別呢?

  1 使用目標不同:

    POST與GET都用於獲取信息,但是GET方式僅僅是查詢,並不對伺服器上的內容產生任何作用結果;每次GET的內容都是相同的。

    POST則常用於發送一定的內容進行某些修改操作。

  2 大小不同:

    由於不同的瀏覽器對URL的長度大小有一定的字元限制,因此由於GET方式放在URL的首部中,自然也跟著首先,但是具體的大小要依瀏覽器而定。

    POST方式則是把內容放在報文內容中,因此只要報文的內容沒有限制,它的大小就沒有限制。

  3 安全性不同:

    上面也說了GET是直接添加到URL後面的,直接就可以在URL中看到內容。

    而POST是放在報文內部的,用戶無法直接看到。

  總的來說,GET用於獲取某個內容,POST用於提交某種數據請求。

  按照使用場景來說,一般用戶註冊的內容屬於私密的,這應該使用POST方式;而針對某一內容的查詢,為了快速的響應,可以使用GET方式。

  

  無狀態

  由於http是一種無狀態的協議,因此無論是客戶端還是伺服器都不記錄http的相關信息。

  這樣設計一方面減輕了伺服器端的負載,另一方面減小了http請求的開銷。

  但是針對某些特殊的場景,需要時刻記錄用戶的相關信息,這該如何處理呢?

  Cookie恰好可以解決這個問題,Cookie的運行機制如下:

  Cookie是一種由伺服器端確定,並保存在客戶端瀏覽器中的內容。這樣,就不需要每次都添加用戶的相關信息,請求會自動添加cookie中對應的內容。

  持久化

  正常在發送http時,都需要建立TCP的連接,再發送報文。

  如果每次想要發送http報文都需要經過這個過程,那麼時間大部分都會消耗在建立和斷開連接的過程中。

  因此http中使用了connection屬性,用於指定連接的方式。

  當設置成keep-alive,如上面所示的www.baidu.com的http頭部信息所示,就會建立一條持久化的連接。

  不需要每次都建立連接,再中斷。

  管道化

  如果一個http請求,請求了大量的圖片等大文件,那麼其他的http請求怎麼辦呢?

  不用怕,http可以一次發送多個http請求,然後等待響應連接。不需要排隊等候,這樣就加快了http的響應時間。

  內容編碼

  由於某些報文的內容過大,因此在傳輸時,為了減少傳輸的時間,會採取一些壓縮的措施。

  例如上面的報文信息中,Accept-Encoding就定義了內容編碼的格式:gzip

  有下麵幾種方式:

  gzip:GNU壓縮格式

  compress:UNIX系統的標準壓縮格式

  deflate:是一種同時使用了LZ77和哈弗曼編碼的無損壓縮格式

  identity:不進行壓縮

 

  多部分對象集合

  有的時候傳輸的內容,不僅僅是一些字元串,還有可能是一些圖片,字元,音樂二進位等混雜的內容。

  這就需要使用多部分對象集合,multipart,例如在使用java編寫web上傳文件的代碼時,需要在form中指定form的編碼格式。

  設置form的enctype屬性的值為multipart/form-data。

  這是因為預設的情況下form使用的編碼格式是:applicatin/x-www-form-urlencoded,這種編碼格式會把所有的內容進行編碼,不適合上傳文件這種情況。

  這兩種編碼格式的區別主要是:

  multipart/form-data 會以控制項為基準,編碼form中的內容。

  application/x-www-form-urlencoded 會把form中的內容編碼成鍵值對的形式。

  範圍請求

  有些場景下,http報文請求一些很大的圖片,但是載入過程很慢。

  比如我們登錄一些大圖片的網址,會發現有時候圖片是一塊一塊載入的。

  這就是因為設置了http請求的長度,這樣就可以分塊的載入資源文件。

  在請求報文中使用Range屬性,在響應報文中使用Content-Type屬性都可以指定一定位元組範圍的http請求。

  參考

  [1] URL與URI的區別:http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html

  [2] POST與GET的區別:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

  [3] GET與POST的長度限制:http://blog.csdn.net/blueling51/article/details/6935901

作者:xingoo 
Github:https://github.com/xinghalo
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。   分類: JavaScript    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是作用域? 作用域規定變數在什麼地方可用。 函數級作用域 1.函數外聲明的變數為全局變數,函數內可以直接訪問全局變數: 2.JavaScript變數的作用域是 函數級 的,只有函數可以產生新的作用域,而非塊級: 變數x雖然在塊語句(if)中聲明並賦值,但它的作用域是函數a,所以在函數a的任何位置 ...
  • break 語句和 continue 語句 break語句和continue語句都具有跳轉作用,可以讓代碼不按既有的順序執行。 break語句用於跳出代碼塊或迴圈。 top: for (var i = 0; i 帶符號位的右移運算符(zero filled right shift):符號為 void ...
  • 代碼如下: 1 /* 2 * Ext表格自定義分頁大小 插件 3 * 4 * 示例PagingToolbar 5 brr = new Ext.ux.PagingToolbar({ 6 plugins: new Ext.ui.plugins.ComboPageSize(), 7 pageSize : ...
  • 初探WebSocket node websocket socket.io 我們平常開發的大部分web頁面都是主動‘拉’的形式,如果需要更新頁面內容,則需要“刷新”一個,但Slack工具卻能主動收到信息,好像服務端能主動給客戶端推送信息,請研究一下這是怎麼實現的。 WebSocket websocke ...
  • Typescript 在前端圈已經逐漸普及,Vue 2.5.0 改進了類型聲明,使得對 TypeScript 更加友好 不過要想在項目中直接使用 TypeScript 仍然需要對項目進行一些改造 PS: 建議使用 Visual Studio Code 進行開發 一、安裝依賴 首先還是用 vue-cl ...
  • 假如你正在運行的微服務少於100,那麼你或許可以規避這些問題,但如果將服務擴展到任意更大的量級,這將帶來其自有的問題,為了使系統高效運行,你需要解決它們。 1:組織性孤立和蔓延 Conway法則的反模式表明,公司的組織結構能夠映射其軟體架構。Fowler-Rigetti稱,一家向微服務遷移的公司經常 ...
  • 1.1 基於TCP協議的RPC 1.1.1 RPC名詞解釋 RPC的全稱是Remote Process Call,即遠程過程調用,RPC的實現包括客戶端和服務端,即服務調用方和服務提供方。服務調用方發送RPC請求到服務提供方,服務提供方根據請求的參數執行請求方法,並將結果返回給服務調用方,一次RPC ...
  • 1.request.getParameter()在get和post方法中文亂碼問題。 參考網址:http://blog.csdn.net/u013476542/article/details/52845547 2.解決windows下tomcat埠被占用 參考網址:http://blog.csdn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...