完成http的傳送和對http伺服器響應資料的處理
1.request,response結構體,封裝http內容以及解析http協議
2.roundtripper介面,能夠執行http傳送,並能返回給定請求的response。該功能可由開發者實現
3.transport結構體,http庫內部實現的roundtripper介面,使用request,reponse,persistconn結構體方法,與遠端伺服器完成資料互動,完成http請求.(涉及到persistconn連線池)
4.persistconn結構體,tcp連線,傳送與接收http協議內容資料,完成與http伺服器端的資料互動
我先簡單貼一下http傳送的使用方法:
設定request請求
req.header.add("authorization", "******x") //設定header頭
傳送request:
client := http.client //設定超時時間
resp, err := client.do(req) //執行http傳送,得到response結構體
if err != nil
fmt.println(resp.status) //列印部分結果
http傳送模組圖如下:
上面http傳送流程圖,只有乙個簡要的大體流程,有很多細節沒有描述處理,將次要細節隱藏了,只保留了主要流程.下面根據傳送流程,簡要的解釋一下各流程的作用.
根據http傳送模組圖,簡要的介紹一下各個過程的作用
①呼叫client.do(req),啟動http傳送功能,使用transport結構體中roundtrip()方法完成傳送功能
② 獲取persistconn連線(復用的連線或者新生成連線),該連線為tcp連線,可以傳送和接收http協議資料,於伺服器端完成互動.
③啟動兩個協程readloop協程和writeloop協程(暫且以此命名,便於描述),啟動協程如下:
go pconn.readloop() //等待從http伺服器端讀取資料
go pconn.writeloop() //等待向http伺服器傳送http協議資料
資料的傳遞由channel實現,連線的roundtrip()方法,向writeloop()協程傳送資料,啟動writeloop向http伺服器傳送資料功能
writeloop協程傳送完成以後,通過channel向readloop協程傳送資料,啟用向伺服器讀取http協議資料功能
readloop協程資料讀取完成,通過channel將資料返回給等待資料的roundtrip方法
persistconn連線的復用,其中指的就是writeloop協程和readloop()協程迴圈傳送和接收資料,每個下圖流程就是一次http請求傳送和接收
資料流動如下,使用channel傳送資料:
④通過channel,將request結構體資料傳入到writeloop協程,writeloop協程使用request的http協議封裝方法,獲取http資料,將資料傳入到http伺服器
⑤呼叫request結構體的write方法,封裝http協議,將資料傳送到http伺服器,其中資料傳送設定的緩衝區大小為32k
⑥資料傳送完成,通知readloop協程讀取http伺服器響應資料
⑦呼叫response檔案中的readresponse()函式,傳入伺服器響應io,解析http響應資料,設定response結構體
⑧將設定完成的response結構體返回
⑨通過channel,將生成的response結構體從readloop協程傳送到http主協程(roundtrip方法中)
⑩將response結構體返回到client中,http傳送完成.
傳送http包命令 curl
使用抓包工具如http analyzer或者firefox的f12都可以修改資料報,再傳送。但有時候會比較坑,最近遇到的乙個問題是firefox的中修改cookie後無任何的效果,再怎麼修改,傳送時還是修改之前的的cookie.而用http analyzer傳送過去總是提示沒有登入。最後用curl來...
python解析http包並傳送
複製fiddler等抓包軟體中的請求資料,可使用下面 直接重發 coding utf8 import requests,urllib3 import sys,os urllib3.disable warnings urllib3.exceptions.insecurerequestwarning 解...
Http協議抓包詳解
抓包分析 get方式 請求部分 抓包分析 post方式 name bbb age 38 響應部分 請求部分 請求行 提交方式 提交方式有很多,常用的get和post get和post的區別 get的提交的引數會顯示到位址列上,而post不顯示.get往往是有大小限制的,而post沒有大小的限制.ge...