golang使用fasthttp 發(fā)起http請求

fasthttp 據(jù)說是目前golang性能最好的http庫捕传,相對于自帶的net/http西土,性能說是有10倍的提升,具體介紹可以看看官方介紹: valyala/fasthttp

正好最近需要用到,但是發(fā)現(xiàn)網(wǎng)上的資料也不是很多凄鼻,特別是關(guān)于client模塊的就更少了,只有一些翻譯成中文的文檔,于是乎就把關(guān)于client的代碼研究了一下块蚌,總結(jié)了一些比較簡單的使用方法闰非,測試對比net/http是有一定程度的提升,如果需要用到http client似乎fasthttp也是一個不錯的選擇峭范,當(dāng)然fasthttp也可以用來做http服務(wù)的财松,不過著并不在此次研究范圍內(nèi)。

順便也提下他的不足之處吧: 一個是他目前還沒有支持http2, 一個是不支持WebSocket,但是WebSocket貌似已經(jīng)有第三方庫的支持了纱控。

fasthttp截至目前為止的todo list:

OK辆毡,言歸正傳,如何更高效得使用fasthttp來發(fā)起請求呢甜害?
emmmm... 好吧舶掖!表達(dá)能力比較一般,還是直接上代碼吧??...

首先肯定是需要安裝fasthttp啦

go get -u github.com/valyala/fasthttp

之后就可以愉快得玩耍了尔店。

先來一波比較簡單的眨攘,發(fā)起一個get請求:

package main

import (
    "github.com/valyala/fasthttp"
)

func main() {
    url := `http://httpbin.org/get`

    status, resp, err := fasthttp.Get(nil, url)
    if err != nil {
        fmt.Println("請求失敗:", err.Error())
        return
    }

    if status != fasthttp.StatusOK {
        fmt.Println("請求沒有成功:", status)
        return
    }

    fmt.Println(string(resp))
}

再來一個Post請求:

func main() {
    url := `http://httpbin.org/post?key=123`
    
    // 填充表單,類似于net/url
    args := &fasthttp.Args{}
    args.Add("name", "test")
    args.Add("age", "18")

    status, resp, err := fasthttp.Post(nil, url, args)
    if err != nil {
        fmt.Println("請求失敗:", err.Error())
        return
    }

    if status != fasthttp.StatusOK {
        fmt.Println("請求沒有成功:", status)
        return
    }

    fmt.Println(string(resp))
}

上面兩個簡單的demo實(shí)現(xiàn)了get和post請求嚣州,這兩個方法也已經(jīng)實(shí)現(xiàn)了自動重定向鲫售,那么如果有更復(fù)雜的請求或需要手動重定向,需要怎么處理呢避诽?比如有些API服務(wù)需要我們提供json body或者xml body也就是龟虎,Content-Type是application/json、application/xml或者其他類型沙庐。繼續(xù)看下面:

func main() {
    url := `http://httpbin.org/post?key=123`
    
    req := &fasthttp.Request{}
    req.SetRequestURI(url)
    
    requestBody := []byte(`{"request":"test"}`)
    req.SetBody(requestBody)

    // 默認(rèn)是application/x-www-form-urlencoded
    req.Header.SetContentType("application/json")
    req.Header.SetMethod("POST")

    resp := &fasthttp.Response{}

    client := &fasthttp.Client{}
    if err := client.Do(req, resp);err != nil {
        fmt.Println("請求失敗:", err.Error())
        return
    }

    b := resp.Body()

    fmt.Println("result:\r\n", string(b))
}

搞定鲤妥,這樣就完成了,but還有優(yōu)化的空間有木有拱雏?
有文章說到它的高性能主要源自于“復(fù)用”棉安,通過服務(wù)協(xié)程和內(nèi)存變量的復(fù)用,節(jié)省了大量資源分配的成本铸抑。
好吧贡耽。。鹊汛。 繼續(xù)優(yōu)化下蒲赂。。
翻閱文檔發(fā)現(xiàn)了他提供了幾個方法:AcquireRequest()刁憋、AcquireResponse(),而且也推薦了在有性能要求的代碼中滥嘴,通過 AcquireRequest 和 AcquireResponse 來獲取 req 和 resp。

func main() {
    url := `http://httpbin.org/post?key=123`

    req := fasthttp.AcquireRequest()
    defer fasthttp.ReleaseRequest(req) // 用完需要釋放資源
    
    // 默認(rèn)是application/x-www-form-urlencoded
    req.Header.SetContentType("application/json")
    req.Header.SetMethod("POST")
    
    req.SetRequestURI(url)
    
    requestBody := []byte(`{"request":"test"}`)
    req.SetBody(requestBody)

    resp := fasthttp.AcquireResponse()
    defer fasthttp.ReleaseResponse(resp) // 用完需要釋放資源

    if err := fasthttp.Do(req, resp); err != nil {
        fmt.Println("請求失敗:", err.Error())
        return
    }

    b := resp.Body()

    fmt.Println("result:\r\n", string(b))
}

經(jīng)過這樣簡單的改動至耻,性能上確實(shí)是增加了一些若皱。

關(guān)于fasthttp的文檔镊叁,如果英文不太好的同學(xué)可以考慮看看中文翻譯版,地址:fasthttp中文文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末走触,一起剝皮案震驚了整個濱河市晦譬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌互广,老刑警劉巖敛腌,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兜辞,居然都是意外死亡迎瞧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門逸吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缝裁,你說我怎么就攤上這事扫皱。” “怎么了捷绑?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵韩脑,是天一觀的道長。 經(jīng)常有香客問我粹污,道長段多,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任壮吩,我火速辦了婚禮进苍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸭叙。我一直安慰自己觉啊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布沈贝。 她就那樣靜靜地躺著杠人,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宋下。 梳的紋絲不亂的頭發(fā)上嗡善,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天,我揣著相機(jī)與錄音学歧,去河邊找鬼罩引。 笑死,一個胖子當(dāng)著我的面吹牛撩满,可吹牛的內(nèi)容都是我干的蜒程。 我是一名探鬼主播绅你,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昭躺!你這毒婦竟也來了忌锯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤领炫,失蹤者是張志新(化名)和其女友劉穎偶垮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帝洪,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡似舵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葱峡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砚哗。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砰奕,靈堂內(nèi)的尸體忽然破棺而出蛛芥,到底是詐尸還是另有隱情,我是刑警寧澤军援,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布仅淑,位于F島的核電站,受9級特大地震影響胸哥,放射性物質(zhì)發(fā)生泄漏涯竟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一空厌、第九天 我趴在偏房一處隱蔽的房頂上張望庐船。 院中可真熱鬧,春花似錦蝇庭、人聲如沸醉鳖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盗棵。三九已至,卻和暖如春北发,著一層夾襖步出監(jiān)牢的瞬間纹因,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工琳拨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞭恰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓狱庇,卻偏偏與公主長得像惊畏,于是被迫代替她去往敵國和親恶耽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容