Go語言實現(xiàn)一個Http?Server框架(一)?http庫的使用
http庫的使用
要實現(xiàn)一個httpServer,首先我們需要先了解一下go語言的原生http庫,通常會用到的包括以下幾個內(nèi)容:
- Body和GetBody
- URL
- Method
- Header
- Form
Body和GetBody
Body一般用于獲取請求體,但是他有一個問題,因為Body本身是一個流,所以只能讀一次,這也就意味著,如果我們有重復(fù)讀取Body的需要,就必須手動進(jì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)
// 記住要返回,不然就還會執(zhí)行后面的代碼
return
}
// 類型轉(zhuǎn)換,將 []byte 轉(zhuǎn)換為 string
fmt.Fprintf(w, "read the data: %s \n", string(body))
// 嘗試再次讀取,啥也讀不到,但是也不會報錯
body, err = io.ReadAll(r.Body)
if err != nil {
// 不會進(jìn)來這里
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ù)讀取的,但是它會返回一個nil,一般用于處理客戶端請求,詳情參考官方文檔 在服務(wù)端處理請求的時候,不建議使用
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ù)后需要自行處理
func queryParams(w http.ResponseWriter, r *http.Request) {
values := r.URL.Query()
fmt.Fprintf(w, "query is %v\n", values)
}Request.URL
包含request請求中一些有用的信息,但是不一定都有,實際使用時需要做一下校驗
- Request.URL里的HOST不一定有值
- Request.Host一般有值
- RawPath也不一定有值
- Path肯定有值

Header
用于獲取請求頭
func header(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "header is %v\n", r.Header)
}
Method
用于獲取請求方法
func method(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Method is %v\n", r.Method)
}Form
用于處理formData,在使用時要先調(diào)用ParseForm,請求頭建議加上:Content-Type: application/x-www-form-urlencoded,因為某些原因還無法處理multipart/form-data

到此這篇關(guān)于Go語言實現(xiàn)一個Http Server框架(一) http庫的使用的文章就介紹到這了,更多相關(guān)Go語言 Http Server框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 統(tǒng)計字符串字?jǐn)?shù)的方法示例
本篇文章主要介紹了Golang 統(tǒng)計字符串字?jǐn)?shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
GO語言創(chuàng)建錢包并遍歷錢包(wallet)的實現(xiàn)代碼
比特幣錢包實際上是一個密鑰對,當(dāng)你安裝 一個錢包應(yīng)用,或者是使用一個比特幣客戶端來生成一個新地址是,他就會為你生成一個密鑰對,今天通過本文給大家分享go語言遍歷錢包的相關(guān)知識,一起看看吧2021-05-05
Go語言開發(fā)框架反射機(jī)制及常見函數(shù)示例詳解
這篇文章主要為大家介紹了Go語言開發(fā)框架反射機(jī)制及常見函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Golang中實現(xiàn)類似類與繼承的方法(示例代碼)
這篇文章主要介紹了Golang中實現(xiàn)類似類與繼承的方法,Go語言中通過方法接受者的類型來決定方法的歸屬和繼承關(guān)系,本文通過示例代碼講解的非常詳細(xì),需要的朋友可以參考下2024-04-04

