本節核心內容
- 介紹使用net/http包創建HTTP服務
- 介紹使用net/http包建立Web服務器
- 介紹Gin框架
本小節視頻教程和代碼:百度網盤;密碼6ejd
可先下載視頻和源碼到本地,邊看視頻邊結合源碼理解后續內容,邊學邊練。
想查看Gin源碼的朋友可自行查看Gin框架官方地址
搭建一個簡單的Web服務器
Go語言標准庫 - net/http
這里給大家提供一個學習Go語言的一個很好的起點,Go語言官方文檔,今天我們學習的Go Web服務器的搭建就需要用到Go語言官方提供的標准庫 net/http,通過http包提供了HTTP客戶端和服務端的實現。同時使用這個包能很簡單地對web的路由,靜態文件,模版,cookie等數據進行設置和操作。如果對http概念不是太清楚的朋友可以自行google。我們先來看一個原生的net/http請求的例子:
創建HTTP服務
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
//生成client 參數為默認
client := &http.Client{}
//生成要訪問的url
url := "http://www.baidu.com"
//提交請求
reqest, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
//處理返回結果
response, _ := client.Do(reqest)
//將結果定位到標准輸出 也可以直接打印出來 或者定位到其他地方進行相應的處理
stdout := os.Stdout
_, err = io.Copy(stdout, response.Body)
//返回的狀態碼
status := response.StatusCode
fmt.Println(status)
}
上面代碼實現了一個簡單的頁面請求,我們可以用這種方式去請求一些網址,已獲得響應,從而對響應數據進行處理,但這種方式很少見,我們先了解即可,下面我們看一下怎樣用http包建立一個web服務器。
http包建立Web服務器
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析參數,默認是不會解析的
fmt.Println(r.Form) //這些信息是輸出到服務器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello Wrold!") //這個寫入到w的是輸出到客戶端的
}
func main() {
http.HandleFunc("/", sayhelloName) //設置訪問的路由
err := http.ListenAndServe("127.0.0.1:9090", nil) //設置要監聽的Ip和端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
頁面輸出:
Hello Wrold!
運行結果:
map[]
path /
scheme
[]
map[]
path /favicon.ico
scheme
[]
可以看到在沒有傳參時,控制台打印的數據都為空,接下來演示一下傳入參數后的結果:
添加參數:
localhost:9090/?url_long=111&url_long=222
運行結果:
map[url_long:[111 222]]
path /
scheme
[111 222]
key: url_long
val: 111222
map[]
path /favicon.ico
scheme
[]
我們看到了上面的代碼,要編寫一個Web服務器是不是很簡單,只要調用http包的兩個函數就可以了。
我們看到Go通過簡單的幾行代碼就已經運行起來一個Web服務了,而且這個Web服務內部有支持高並發的特性。我們現在知道了原來創建一個http服務,大致只需要經歷兩個過程
- 注冊路由
提供url模式和handler函數的映射,並實例化一個server對象,並開啟對客戶端的監聽。
http.HandleFunc("/", sayhelloName)
- 設定要監聽的IP和端口。
http.ListenAndServe("127.0.0.1:9090", nil)
是不是很簡單?趕緊自己動手試試吧。
Gin框架
在學習了前面的內容,我們來了解一個框架Gin,Gin是一個golang的微框架,封裝比較優雅,API友好,源碼注釋比較明確,已經發布了1.0版本。具有快速靈活,容錯方便等特點。該官網的說法是它具有更好的性能,有多好呢?據說是速度提升了40倍,所以這也是我們今后開發中主要使用的一個框架。
代碼示例:
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func Login(c *gin.Context) {
fmt.Fprintf(c.Writer,"Welcome index!")
}
func main() {
router := gin.Default()
router.GET("/",Login)
router.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
router.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
router.POST("/your/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
router.Run(":8080")
}
頁面返回結果:
Welcome index!
請求參數:
頁面返回結果:
name:jeck is /18
使用Get請求Post路徑:
小結
本小節主要給大家演示了分別基於Http的請求,和基於Http包以及Gin框架的web服務,其中首推Gin框架,因為它有着更高的效率