最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言實(shí)現(xiàn)一個(gè)Http?Server框架(一)?http庫(kù)的使用

 更新時(shí)間:2023年04月28日 09:32:53   作者:upper  
本文主要介紹用Go語(yǔ)言實(shí)現(xiàn)一個(gè)Http?Server框架中對(duì)http庫(kù)的基本使用說(shuō)明,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以借鑒一下

http庫(kù)的使用

要實(shí)現(xiàn)一個(gè)httpServer,首先我們需要先了解一下go語(yǔ)言的原生http庫(kù),通常會(huì)用到的包括以下幾個(gè)內(nèi)容:

  • Body和GetBody
  • URL
  • Method
  • Header
  • Form

Body和GetBody

Body一般用于獲取請(qǐng)求體,但是他有一個(gè)問(wèn)題,因?yàn)锽ody本身是一個(gè)流,所以只能讀一次,這也就意味著,如果我們有重復(fù)讀取Body的需要,就必須手動(dòng)進(jìn)行處理否則程序會(huì)出問(wèn)題

func readBodyOnce(w http.ResponseWriter, r *http.Request)  {
	body, err := io.ReadAll(r.Body)
	if err != nil {
		fmt.Fprintf(w, "read body failed: %v", err)
		// 記住要返回,不然就還會(huì)執(zhí)行后面的代碼
		return
	}
	// 類型轉(zhuǎn)換,將 []byte 轉(zhuǎn)換為 string
	fmt.Fprintf(w, "read the data: %s \n", string(body))

	// 嘗試再次讀取,啥也讀不到,但是也不會(huì)報(bào)錯(cuò)
	body, err = io.ReadAll(r.Body)
	if err != nil {
		// 不會(huì)進(jìn)來(lái)這里
		fmt.Fprintf(w, "read the data one more time got error: %v", err)
		return
	}
	fmt.Fprintf(w, "read the data one more time: [%s] and read data length %d \n", string(body), len(body))
}

GetBody原則上是允許重復(fù)讀取的,但是它會(huì)返回一個(gè)nil,一般用于處理客戶端請(qǐng)求,詳情參考官方文檔 在服務(wù)端處理請(qǐng)求的時(shí)候,不建議使用

func getBodyIsNil(w http.ResponseWriter, r *http.Request) {
	if r.GetBody == nil {
		fmt.Fprint(w, "GetBody is nil \n")
	} else {
		fmt.Fprintf(w, "GetBody not nil \n")
	}
}

URL

Request.URL.Query

用于獲取queryParam,所有的值在獲取到的時(shí)候都是字符串,因此拿到參數(shù)后需要自行處理

func queryParams(w http.ResponseWriter, r *http.Request) {
	values := r.URL.Query()
	fmt.Fprintf(w, "query is %v\n", values)
}

Request.URL

包含request請(qǐng)求中一些有用的信息,但是不一定都有,實(shí)際使用時(shí)需要做一下校驗(yàn)

  • Request.URL里的HOST不一定有值
  • Request.Host一般有值
  • RawPath也不一定有值
  • Path肯定有值

Header

用于獲取請(qǐng)求頭

func header(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "header is %v\n", r.Header)
}

Method

用于獲取請(qǐng)求方法

func method(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintf(w, "Method is %v\n", r.Method)  
}

Form

用于處理formData,在使用時(shí)要先調(diào)用ParseForm,請(qǐng)求頭建議加上:Content-Type: application/x-www-form-urlencoded,因?yàn)槟承┰蜻€無(wú)法處理multipart/form-data

到此這篇關(guān)于Go語(yǔ)言實(shí)現(xiàn)一個(gè)Http Server框架(一) http庫(kù)的使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 Http Server框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入學(xué)習(xí)Golang的流程控制

    深入學(xué)習(xí)Golang的流程控制

    Go 語(yǔ)言是一門現(xiàn)代化的編程語(yǔ)言,以其簡(jiǎn)潔高效、并發(fā)安全等特點(diǎn)被越來(lái)越多的開發(fā)者所使用。本文將深入探討 Go 語(yǔ)言中的流程控制,包括條件語(yǔ)句、循環(huán)語(yǔ)句以及控制語(yǔ)句等方面
    2023-05-05
  • golang 執(zhí)行命令行的實(shí)現(xiàn)

    golang 執(zhí)行命令行的實(shí)現(xiàn)

    本文主要介紹了golang 執(zhí)行命令行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Go語(yǔ)言定時(shí)任務(wù)cron的設(shè)計(jì)與使用

    Go語(yǔ)言定時(shí)任務(wù)cron的設(shè)計(jì)與使用

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中定時(shí)任務(wù)cron的設(shè)計(jì)與使用,文中的示例代碼講解詳細(xì),對(duì)我們深入掌握Go語(yǔ)言有一定的幫助,需要的可以參考下
    2023-11-11
  • 解決go語(yǔ)言ssh客戶端密碼過(guò)期問(wèn)題

    解決go語(yǔ)言ssh客戶端密碼過(guò)期問(wèn)題

    這篇文章主要介紹了go語(yǔ)言ssh客戶端解決密碼過(guò)期問(wèn)題,本文給大家分享了解決的方法和原理,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Golang中的path/filepath包用法

    Golang中的path/filepath包用法

    這篇文章主要介紹了Golang中的path/filepath包用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    本篇文章主要介紹了Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Go1.18都出泛型了速來(lái)圍觀

    Go1.18都出泛型了速來(lái)圍觀

    泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語(yǔ)言中編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型,本文通過(guò)例子給大家介紹下如何使用泛型,對(duì)Go1.18泛型相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-03-03
  • GO語(yǔ)言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼

    GO語(yǔ)言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼

    比特幣錢包實(shí)際上是一個(gè)密鑰對(duì),當(dāng)你安裝 一個(gè)錢包應(yīng)用,或者是使用一個(gè)比特幣客戶端來(lái)生成一個(gè)新地址是,他就會(huì)為你生成一個(gè)密鑰對(duì),今天通過(guò)本文給大家分享go語(yǔ)言遍歷錢包的相關(guān)知識(shí),一起看看吧
    2021-05-05
  • Go語(yǔ)言開發(fā)框架反射機(jī)制及常見函數(shù)示例詳解

    Go語(yǔ)言開發(fā)框架反射機(jī)制及常見函數(shù)示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言開發(fā)框架反射機(jī)制及常見函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Golang中實(shí)現(xiàn)類似類與繼承的方法(示例代碼)

    Golang中實(shí)現(xiàn)類似類與繼承的方法(示例代碼)

    這篇文章主要介紹了Golang中實(shí)現(xiàn)類似類與繼承的方法,Go語(yǔ)言中通過(guò)方法接受者的類型來(lái)決定方法的歸屬和繼承關(guān)系,本文通過(guò)示例代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04

最新評(píng)論

靖西县| 铜鼓县| 新余市| 朔州市| 临沧市| 五大连池市| 关岭| 大石桥市| 罗甸县| 台湾省| 武胜县| 克什克腾旗| 浦城县| 崇明县| 青川县| 肇东市| 拉孜县| 永顺县| 兰溪市| 石嘴山市| 罗甸县| 富裕县| 和政县| 宁波市| 永仁县| 沛县| 浦北县| 寻乌县| 临澧县| 伊通| 永兴县| 北川| 东至县| 蒲江县| 渝北区| 海南省| 绥江县| 英吉沙县| 肥西县| 兴国县| 巢湖市|