Go語言從入門到精通 -【web項目實戰篇】- 搭建Web服務器


本節核心內容

  • 介紹使用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!

請求參數:

http://localhost:8080/user/name:jeck/18

頁面返回結果:

name:jeck is /18

使用Get請求Post路徑:

http://localhost:8080/your/name:Lucy/21

image

小結

本小節主要給大家演示了分別基於Http的請求,和基於Http包以及Gin框架的web服務,其中首推Gin框架,因為它有着更高的效率


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM