好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > golang 網絡框架之gin的使用方法

golang 網絡框架之gin的使用方法

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

golang 原生 http 庫已經可以很方便地實現一個 http server 了,但對于復雜的 web 服務來說,路由解析,請求參數解析,對象返回等等,原生 api 就顯得有些不太夠用了,而 gin 是一個功能完備,性能很高的 web 網絡框架,特別適合 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è)務邏輯都在 func(c *gin.Context) 函數中實現,請求和返回都通過這個 gin.Context 傳遞

請求參數解析

gin 提供了豐富的請求參數獲取方式

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

但這些函數我都不建議使用,建議用結構體來描述請求,再使用 bind api 直接將獲取請求參數

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 參數填充結構體中的 uri 字段
if err := c.BindUri(req); err != nil {
  return nil, nil, http.StatusBadRequest, fmt.Errorf("bind uri failed. err: [%v]", err)
}

// GET 請求中用 Query 參數填充 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 跨域

服務端返回的頭部中有個字段 "Access-Control-Allow-Origin",如果該字段和請求的域不同,瀏覽器會被瀏覽器拒絕,其實這個地方我理解應該是客戶端沒有權限訪問,服務端不該返回結果,瀏覽器認為結果不可用,所以提示跨域錯誤,而這個頭部字段還只能寫一個地址,或者寫成 *,對所有網站都開放,要想對多個網站開發(fā),我們可以根據請求的 "Origin" 字段,動態(tài)地設置 "Access-Control-Allow-Origin" 字段,滿足權限得設置成請求中的 "Origin" 字段,gin 的有個插件 github.com/gin-contrib/cors 就是專門用來做這個事情的,可以在 AllowOrigins 中設置多個網站,還可以設置通配符(需設置 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 是網站的地址,如需跨域共享 cookie,可以設置成域名,
//   比如 a.example.com 和 b.example.com,可以將 domain 設置成 example.com
// secure 為 https 設為 true,http 設為 false
// httpOnly 設置為 false,否則 axios 之類的庫訪問不到 cookie
(c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

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

鏈接

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

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

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

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

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