主頁 > 知識庫 > golang 網(wǎng)絡(luò)框架之gin的使用方法

golang 網(wǎng)絡(luò)框架之gin的使用方法

熱門標簽:江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 南通如皋申請開通400電話 浙江高速公路地圖標注 地圖標注的汽車標 學海導航地圖標注 西部云谷一期地圖標注 高德地圖標注口訣 廣州呼叫中心外呼系統(tǒng) 中國地圖標注省會高清

golang 原生 http 庫已經(jīng)可以很方便地實現(xiàn)一個 http server 了,但對于復雜的 web 服務(wù)來說,路由解析,請求參數(shù)解析,對象返回等等,原生 api 就顯得有些不太夠用了,而 gin 是一個功能完備,性能很高的 web 網(wǎng)絡(luò)框架,特別適合 web api 的開發(fā)

hello world

package main

import "github.com/gin-gonic/gin"

func main() {
  r := gin.New()
  r.GET("/ping", func(c *gin.Context) {
    c.String(200, "hello world")
  })
  r.Run() // listen and serve on 0.0.0.0:8080
}

如這個 hello world 程序所示 gin 所有的業(yè)務(wù)邏輯都在 func(c *gin.Context) 函數(shù)中實現(xiàn),請求和返回都通過這個 gin.Context 傳遞

請求參數(shù)解析

gin 提供了豐富的請求參數(shù)獲取方式

(c *Context) Query(key string) string        // 獲取 GET 參數(shù)
(c *Context) QueryArray(key string) []string    // 獲取 GET 參數(shù)數(shù)組
(c *Context) DefaultQuery(key, defaultValue string) // 獲取 GET 參數(shù),并提供默認值
(c *Context) Param(key string) string        // 獲取 Param 參數(shù),類似于 "/user/:id"
(c *Context) GetRawData() ([]byte, error)      // 獲取 body 數(shù)據(jù)

但這些函數(shù)我都不建議使用,建議用結(jié)構(gòu)體來描述請求,再使用 bind api 直接將獲取請求參數(shù)

type HelloWorldReq struct {
  Token  string `json:"token"`
  ID    int  `json:"id" uri:"id"`
  Email  string `json:"email" form:"email"`
  Password string `json:"password" form:"password"`
}

req := HelloWorldReq{
  Token: c.GetHeader("Authorization"),  // 頭部字段無法 bind,可以通過 GetHeader 獲取
}

// 用請求中的 Param 參數(shù)填充結(jié)構(gòu)體中的 uri 字段
if err := c.BindUri(req); err != nil {
  return nil, nil, http.StatusBadRequest, fmt.Errorf("bind uri failed. err: [%v]", err)
}

// GET 請求中用 Query 參數(shù)填充 form 字段
// 非 GET 請求,將 body 中的 json 或者 xml 反序列化后填充 form 字段
if err := c.Bind(req); err != nil {
  return nil, nil, http.StatusBadRequest, fmt.Errorf("bind failed. err: [%v]", err)
}

http 的客戶端 ip 一般在請求頭的 X-Forwarded-For 和 X-Real-Ip 中,gin 提供了 (c *Context) ClientIP() string 來獲取 ip

返回包體

(c *Context) String(code int, format string, values ...interface{}) // 返回一個字符串
(c *Context) JSON(code int, obj interface{})            // 返回一個 json
(c *Context) Status(code int)                    // 返回一個狀態(tài)碼

文件上傳和返回

從請求中獲取文件

fh, err := ctx.FormFile("file")
if err != nil {
  return err
}

src, err := fh.Open()
if err != nil {
  return err
}
defer src.Close()

返回文件

(c *Context) File(filepath string)

cros 跨域

服務(wù)端返回的頭部中有個字段 "Access-Control-Allow-Origin",如果該字段和請求的域不同,瀏覽器會被瀏覽器拒絕,其實這個地方我理解應(yīng)該是客戶端沒有權(quán)限訪問,服務(wù)端不該返回結(jié)果,瀏覽器認為結(jié)果不可用,所以提示跨域錯誤,而這個頭部字段還只能寫一個地址,或者寫成 *,對所有網(wǎng)站都開放,要想對多個網(wǎng)站開發(fā),我們可以根據(jù)請求的 "Origin" 字段,動態(tài)地設(shè)置 "Access-Control-Allow-Origin" 字段,滿足權(quán)限得設(shè)置成請求中的 "Origin" 字段,gin 的有個插件 github.com/gin-contrib/cors 就是專門用來做這個事情的,可以在 AllowOrigins 中設(shè)置多個網(wǎng)站,還可以設(shè)置通配符(需設(shè)置 AllowWildcard 為 true)

import "github.com/gin-contrib/cors"

r := gin.New()
r.Use(cors.New(cors.Config{
  AllowOrigins:   []string{"a.example.com", "b.example.com"},
  AllowMethods:   []string{"PUT", "POST", "GET", "OPTIONS"},
  AllowHeaders:   []string{"Origin", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "Accept", "Cache-Control", "X-Requested-With"},
  AllowCredentials: true,
}))

cookies

// maxAge 為過期時間
// domain 是網(wǎng)站的地址,如需跨域共享 cookie,可以設(shè)置成域名,
//   比如 a.example.com 和 b.example.com,可以將 domain 設(shè)置成 example.com
// secure 為 https 設(shè)為 true,http 設(shè)為 false
// httpOnly 設(shè)置為 false,否則 axios 之類的庫訪問不到 cookie
(c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

另外,axios 需要設(shè)置 withCredentials: true cookie 才能正常返回

鏈接

github 地址: https://github.com/gin-gonic/gin
代碼示例: https://github.com/hpifu/tpl-go-http

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • mac下安裝golang框架iris的方法
  • golang常用庫之操作數(shù)據(jù)庫的orm框架-gorm基本使用詳解
  • golang日志框架之logrus的使用
  • 詳解Golang Iris框架的基本使用

標簽:常州 貴州 保定 曲靖 德宏 吐魯番 東營 許昌

巨人網(wǎng)絡(luò)通訊聲明:本文標題《golang 網(wǎng)絡(luò)框架之gin的使用方法》,本文關(guān)鍵詞  golang,網(wǎng)絡(luò),框架,之,gin,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 網(wǎng)絡(luò)框架之gin的使用方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang 網(wǎng)絡(luò)框架之gin的使用方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章