1. 程式人生 > >Android之Http通信——1.初識Http協議

Android之Http通信——1.初識Http協議

網頁 ip協議 作用 建立連接時 lin 是什麽 方式 設置 全部

Android之Http通信——1.初識Http協議

引言:


今天是六一兒童節,先在這裏給各位超齡兒童說聲節日快樂哈~( ╯□╰ ),小豬也象征性地給群裏的小朋友們派了紅包…嗯,忙碌的五月最終過去了,做畢設,寫論文,拍畢業照,答辯,辭職。各種各樣的事,也算忙完了,好吧。小豬如今又在一家新的公司上班了。第三間公司了。你們肯定會認為小豬三心二意是吧,畢竟才差點兒相同畢業就換了那麽多家公司,然後可能問我。”小豬你什麽時候跳第四間公司”,哈哈,應該不會了哈,怎麽說呢,事實上我還是非常專一的,畢竟我才剛畢業。我還臨時不須要去養家糊口。贍養老人,並且我沒女朋友。哈哈~所以趁著年輕,選擇適合自己的生長的土壤。學多點本事,工資事實上沒什麽,真的,能學到東西才是關鍵,等真正有本事了。那個時候就能夠談工資了,比方我這個公司的大牛(只是這周已跳槽到魅族了)。第一次感覺到大牛的氣息,B格真心高。自愧不如,人家自己寫組件。推送,各種代碼封裝。各種設計模式,並且會服務端,測試。IOS…有點看小說裏。一個剛入門的小學徒看到一個宗師級別的高手時那種感覺,以前。小豬自卑了幾天,一直在想,我真的能接手他的項目嗎?或者說看懂他代碼?又或者我是否能寫出這樣的代碼?那幾天,整個人都非常浮躁。各種負面情緒,連代碼都看不進去;後來不經意看到了一個講設計的TED演講,標題是:《怎樣成為一名優秀的設計師:羅子雄》,這個雖然不是說編程的,可是事實上非常多東西都是相通的。分為兩個階段:入門&準專業級,”你們希望你們希望成為一名設計師。但不止如此,你們希望成為的是一名優秀的設計師。但沒有人生下來就是優秀的,沒有人生下來就是牛逼的,沒有人生下來就會UI設計。會平面設計。會網頁設計。”。從入門到準專業級,我們須要多少經驗?”格拉德威爾在《異類》一書中指出:“人們眼中的天才。並不是卓越非凡,而是付出了持續不斷的努力,一萬小時的錘煉是不論什麽人從平庸變成超凡的必要條件。

”一萬小時。也就是說你每天工作8小時的時間,每周工作5天,你須要5年。你無需天才,無需智商過人,無需三頭六臂,無需頭上長角,你僅僅須要持續的、堅持的努力,有正確的方法,就能夠在設計領域,一個專業中獨當一面。”看完,整個人就闊讓開朗了,心也就靜下來了,對啊,人家做多久,我做多久了?人家做五年了,我僅僅是個剛畢業的實習生,不會非常正常啊,非常多東西,急不來。每天有規劃。一步一個腳印,日積月累。堅持5年。或者不用。我也能成為一個準專業級的大牛是吧,所以何必自卑呢~恩呢,心靈雞湯的東西就講這麽多吧。喝多了酒沒作用了,視頻還是不錯的,有興趣能夠看看哈,好了,從今天開始小豬會在學習公司項目的同一時候總結相關的一些東西,然後分享給大家,第一個章節解說的是Android中的Http通信,先敘述下Http相關的一些概念,然後講下Android上發送Http請求的兩種方式:HttpUrlConnection與HttpClient,然後使用retrofit框架封裝我們的HTTP請求,最後用RxJava實現響應式編程,實現網絡的異步請求調用。當然小豬也是在學習其中。假設有什麽寫得不正確的地方。歡迎指出,萬分感激~


正文:

1.Http是什麽鬼?

①名詞解析:

  • hypertext transfer protocol(超文本傳輸協議),TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEBserver之間交換數據的過程。

    client連上webserver後,若想獲得webserver中的某個web資源,需遵守一定的通訊格式,HTTP協議用於定義client與webserver通迅的格式。

②Http 1.0 與 Http 1.1的差別:

  • 1.0協議。client與webserver建立連接後,僅僅能獲得一個web資源!
  • 1.1協議,同意client與webserver建立連接後,在一個連接上獲取多個web資源!

PS:如今大部分的都是用的Http 1.1協議的~

③Http請求的工作流程:

這裏先介紹兩個名詞,SYN和ACK

  • SYN(synchronous):TCP/IP建立連接時使用的握手信號
  • ACK(Acknowledgement):確認字符。確認發來的數據已經接受無誤

接著說下TCP/IP三次握手的概念:

  1. client發送syn包(syn = j)到server,進入SYN_SEND狀態,然後等待server確認
  2. server收到syn包,確認客戶的syn(ack = j + 1),同一時候在自己也發送一個SYN包(syn=k),
    即SYN + ACK包,server進入SYN_RECV狀態
  3. client收到SYN + ACK包,想server發送確認包ACK(ack = k +1),發送完畢後,client與服務端
    進入ESTABLISHED狀態。完畢三次握手,然後兩者開始傳送數據

假設你認為復雜的話,看圖想想你就有個大概印象了,三次握手示意圖例如以下:

技術分享

Http操作的流程:

  1. 用戶點擊瀏覽器上的url(超鏈接)。Web瀏覽器與Webserver建立連接
  2. 建立連接後。client發送請求給server,請求的格式為:
    統一資源標識符(URL)+協議版本(通常是1.1)+MIME信息(多個消息頭)+一個空行
  3. 服務端受到請求後。給予對應的返回信息,返回格式為:
    協議版本 + 狀態行(處理結果) + 多個信息頭 + 空行 + 實體內容(比方返回的HTML)
  4. client接收服務端返回信息,通過瀏覽器顯示出來,然後與服務端斷開連接;當然假設中途某步錯誤發生的話,錯誤信息會返回到client,並顯示,比方:經典的404錯誤

好吧,No pic you say a jb,有圖有真相,以下我們用HttpWatch來抓下包(當然,你也能夠直接用Chrome f12),這裏測試的站點是小豬學校的教務系統:輸入賬號password後,發送登陸請求,相關信息頭。至於相關的信息頭,我們下節再具體解說~:

HTTP請求包含的內容:

技術分享

HTTP響應包含的內容:

技術分享

④Http請求的幾種方式:

我們看到上面我們發送http請求的方式是POST,它和GET在我們平時開發中使用較多,以下我們就羅列出全部的請求方式吧:

  • Get:請求獲取Request-URI所標識的資源
  • POST:在Request-URI所標識的資源後附加新的數據
  • HEAD 請求獲取由Request-URI所標識的資源的響應信息報頭
  • PUT:請求server存儲一個資源,並用Request-URI作為其標識
  • DELETE:請求server刪除Request-URI所標識的資源
  • TRACE:請求server回送收到的請求信息,主要用於測試或診斷
  • CONNECT:保留將來使用
  • OPTIONS:請求查詢server的性能。或者查詢與資源相關的選項

好吧,除了GET和POST其它的,筆者也沒用過,所以,這裏僅僅區分GET和POST的差別:

  • GET:在請求的URL地址後以?的形式帶上交給server的數據。多個數據之間以&進行分隔,但數據容量通常不能超過2K,比方:http://xxx?

    username=…&pawd=…這樣的就是GET

  • POST: 這個則能夠在請求的實體內容中向server發送數據,傳輸沒有數量限制
  • 另外要說一點,這兩個玩意都是發送數據的,僅僅是發送機制不一樣,不要相信網上說的”GET獲得server數據,POST向server發送數據”!!
    另外GET安全性非常低。Post安全性較高,可是運行效率卻比Post方法好,一般查詢的時候我們用GET。數據增刪改的時候用POST。!

⑤Http狀態碼合集:

  1. 100~199 : 成功接受請求,client需提交下一次請求才幹完畢整個處理過程
  2. 200: OK,client請求成功
  3. 300~399:請求資源已移到新的地址(302,307,304)
  4. 401:請求未授權。改狀態代碼需與WWW-Authenticate報頭域一起使用
  5. 403:Forbidden。server收到請求,可是拒絕提供服務
  6. 404:Not Found,請求資源不存在,這個就不用說啦
  7. 500:Internal Server Error。server發生不可預期的錯誤
  8. 503:Server Unavailable。server當前不能處理client請求。一段時間後可能恢復正常

⑥Http協議的特點

好吧。這些東西知道就能夠了,小豬就不自己慢慢扣了,直接復制粘貼哈~

  1. 支持客戶/server模式。
  2. 簡單高速:客戶向server請求服務時。僅僅需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與server聯系的類型不同。

    由於HTTP協議簡單,使得HTTPserver的程序規模小,因而通信速度非常快。

  3. 靈活:HTTP同意傳輸隨意類型的數據對象。正在傳輸的類型由Content-Type加以標記。

  4. 無連接:無連接的含義是限制每次連接僅僅處理一個請求。server處理完客戶的請求,並收到客戶的應答後。即斷開連接。採用這樣的方式能夠節省傳輸時間。
    5.無狀態:HTTP協議是無狀態協議。

    無狀態是指協議對於事務處理沒有記憶能力。

    缺少狀態意味著假設興許處理須要前面的信息,則它必須重傳。這樣可能導致每 次連接傳送的數據量增大。還有一方面。在server不須要先前信息時它的應答就較快。

⑦OSI七層協議&TCP四層協議;

恩,這個我們知道就能夠了,興許有須要的話再深入了解,我們的HTTP請求是出於第七層:應用層的,
大家知道就能夠了,另外最好記下這七層,對了,一到三層是用於創建兩個網絡設備間的物理連接的。
而四到七層主要負責互操作性,背熟就好,面試說不定問下呢,是吧。哈哈~

OSI七層協議圖&TCP四層模型圖:

技術分享

另外小豬查相關資料的時候,發現一個B格更高的總結圖,有興趣的能夠慢慢研究:
技術分享

貼下原文鏈接,想刨根問底的能夠看下:

OSI七層模型具體解釋

總結:

好吧,由於時間比較倉促,畢竟僅僅能下班的時候寫寫,可能有點亂,望體諒,有時間會又一次捋一捋思路。部分內容參考的慕課網的”Android HTTP通信“視頻的 內容,有興趣能夠去慕課看看。恩。最後總結下本節的東東吧:

  1. 介紹了下HTTP協議的一些概念、
  2. 簡單的說了下HTTP 1.0 和HTTP 1.1的差別
  3. HTTP請求的流程,包含SYN和ACK的概念,TCP/IP三次握手,HTTP操作的流程,HTTP請求的幾種幾種方式,HTTP狀態碼合集,以及HTTP協議特點
  4. OSI七層協議圖&TCP四層模型圖

本節都是一些概念性的東西,了解了解就好。下一節,我們來研究不同的響應頭。我們服務端通過設置不同的響應頭來控制瀏覽器的一些行為,比方頁面從定向。定時刷新。提示文件下載等,敬請期待~好了。洗澡睡覺。明天繼續上班哼(ˉ(∞)ˉ)唧~

PS:剛舍友路過,問我一晚上在扣什麽?寫代碼麽,我說寫博。然後他又問這能賺錢麽?我說不能。然後他說,那寫了有個卵用…我也不知道怎麽跟他解釋,每一個人的看法。價值觀不同吧。我喜歡寫博,雖然我不是大牛,我寫出來的東西B格也沒人家高。可能都是一些基礎的東西。雖然如此,我還是願意在下班吃完飯後,埋頭碼字一個晚上,不積跬步何以千裏。持續的。堅持的努力,再加上正確的方法,小豬也有成為大牛的那一天的,另外,把摸索出來的方法寫出來,又能夠方便後來者。何樂而不為呢?是吧!

與各位攻城獅們共勉~加油

Android之Http通信——1.初識Http協議