網(wǎng)站首頁 編程語言 正文
如何用golang搭建一個web服務(wù)呢?菜鳥官網(wǎng)的go web編程教程已經(jīng)介紹了web服務(wù)器的工作原理,這里就不贅述了。
我們先看個例子:http.go
package main import ( "fmt" "io" "log" "net/http" ) func main() { http.HandleFunc("/test", doRequest) // 設(shè)置訪問路由 err := http.ListenAndServe(":8000", nil) //設(shè)置監(jiān)聽的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } } func doRequest(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析url傳遞的參數(shù),對于POST則解析響應(yīng)包的主體(request body) //fmt.Println(r.Form) //這些信息是輸出到服務(wù)器端的打印信息 //fmt.Println("path", r.URL.Path) //fmt.Println("scheme", r.URL.Scheme) //for k, v := range r.Form { // fmt.Println("key:", k) // fmt.Println("value:", strings.Join(v, "")) //} fmt.Fprintf(w, "service start...") //這個寫入到w的是輸出到客戶端的 也可以用下面的 io.WriteString對象 //注意:如果沒有調(diào)用ParseForm方法,下面無法獲取表單的數(shù)據(jù) //query := r.URL.Query() var uid string // 初始化定義變量 if r.Method == "GET" { uid = r.FormValue("uid") } else if r.Method == "POST" { uid = r.PostFormValue("uid") } io.WriteString(w, "uid = "+uid) }
go run http.go
命令運(yùn)行程序。
之后在瀏覽器中輸入地址:http://127.0.0.1:8000/test?uid=10086
,看下結(jié)果。
在main函數(shù)中,我們從net/http
包中調(diào)用了一個http.HandleFucn
函數(shù)來注冊一個處理函數(shù)
這個函數(shù)接受兩個參數(shù)。第一個是字符串,這個就是進(jìn)行路由匹配,我這里是/test路由。第二個參數(shù)是一個func (ResponseWriter, Request)
的簽名。
我們的doRequest函數(shù)就是這樣的簽名。下一行中的http.ListenAndServe(":8000", nil)
,表示監(jiān)聽localhost的8000端口,暫時忽略掉nil。
在doRequest函數(shù)中我們有兩個參數(shù),一個是http.ResponseWriter
類型的。它類似響應(yīng)流,實(shí)際上是一個接口類型。
第二個是http.Request
類型,類似于HTTP 請求。我們不必使用所有的參數(shù),如果只是簡單的輸出,那么我們只需要使用http.ResponseWriter,io.WriteString,將會把輸出流寫入數(shù)據(jù)。
我們再稍微改下,大家請注意修改的部分(這里我們只調(diào)整 main函數(shù)部分代碼)
func main() { mux := http.NewServeMux() mux.HandleFunc("/test", doRequest) err := http.ListenAndServe(":8000", mux) //設(shè)置監(jiān)聽的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } }
這個例子中,我們不再在函數(shù)http.ListenAndServe
使用nil
了。這個例子跟上面的例子其實(shí)是一樣的。使用http注冊hanlder 函數(shù)模式就是用的ServeMux。
我們再調(diào)整下看下更復(fù)雜的例子:
package main import ( "fmt" "io" "log" "net/http" ) var mux map[string]func(http.ResponseWriter, *http.Request) func main() { server := http.Server{ Addr: ":8000", Handler: &doHandler{}, } mux = make(map[string]func(http.ResponseWriter, *http.Request)) mux["/test"] = doRequest err := server.ListenAndServe() if err != nil { log.Fatal("ListenAndServe: ", err) } } type doHandler struct{} func (*doHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if res, ok := mux[r.URL.String()]; ok { res(w, r) return } io.WriteString(w, "url params: "+r.URL.String()) } func doRequest(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析url傳遞的參數(shù),對于POST則解析響應(yīng)包的主體(request body) fmt.Fprintf(w, "service start...") //這個寫入到w的是輸出到客戶端的 也可以用下面的 io.WriteString對象 }
這個例子我們沒有定義ServeMux,而是使用了http.Server。都是用net/http包運(yùn)行了服務(wù)器。
原文鏈接:https://www.cnblogs.com/phpper/p/10408206.html
相關(guān)推薦
- 2023-07-02 oracle數(shù)據(jù)庫排序后如何獲取第一條數(shù)據(jù)_oracle
- 2022-12-08 python?datetime?和時間戳互相轉(zhuǎn)換問題_python
- 2023-03-04 Google大佬都用的廣播goAsync源碼分析_Android
- 2022-07-21 VScode設(shè)置自定義背景
- 2022-12-09 C++中利用cout和fstream采用非科學(xué)計(jì)數(shù)法輸出_C 語言
- 2023-10-10 ant tree拖動排序 實(shí)現(xiàn)同級拖動 和 跨級拖動
- 2022-07-26 Python使用psutil獲取系統(tǒng)信息_python
- 2022-06-13 Docker容器數(shù)據(jù)卷介紹及操作示例_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支