成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言高性能 Web 框架 Gin 框架路由和請求參數的使用方式

開發 前端
本文我們介紹 Go 語言高性能 Web 框架 Gin 框架的路由和請求參數的一般使用方式,建議讀者朋友們動手運行文章中的示例代碼。

1.介紹

使用 Web 框架,可以在開發項目時更高效。Web 框架一般會支持基礎功能,比如路由、處理請求參數、渲染返回結果、中間件等。

本文我們介紹一款輕量級 Web 框架 Gin 框架。

示例代碼:

package main

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

func main() {
 r := gin.Default()
 r.GET("/ping", func(c *gin.Context) {
  c.JSON(200, gin.H{
   "message": "pong",
  })
 })
 r.Run()
}

輸出結果:

curl -s http://127.0.0.1:8080/ping | jq
{
  "message": "pong"
}

閱讀上面這段代碼,我們導入三方庫 github.com/gin-gonic/gin,使用 gin.Default() 函數創建一個使用 Logger 和 Recovery 中間件的 Engine 實例(框架實例)。

然后使用 r.GET() 方法創建一個處理器,實際上 r.GET() 是 r.Handle() 的快捷方式。

最后,使用 r.Run() 方法(默認監聽地址 0.0.0.0:8080)綁定處理器到 http.Server,并開始監聽和處理 http 請求,實際上 r.Run() 方法是 http.ListenAndServe() 函數的快捷方式。

2.路由

注冊路由

使用 Gin 框架注冊路由,調用框架實例的方法即可,Gin 框架提供 Handle() 方法,可以方便我們注冊任意 HTTP 方法的路由,示例代碼:

package main

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

func main() {
 r := gin.Default()
 r.Handle("GET", "/ping", func(c *gin.Context) {
  c.JSON(200, gin.H{
   "message": "pong",
  })
 })
 r.Run()
}

閱讀上面這段代碼,我們可以發現 r.Handle() 方法接收 3 個參數,第一個是 HTTP方法,第二個是路徑,第三個是處理器函數。

Gin 框架還提供了一些 HTTP 方法的快捷方式,例如:r.GET()、 r.POST()、r.DELETE()、r.PATCH()、r.PUT()、r.OPTIONS()、r.HEAD()。

此外,Gin 框架還提供了一個可以匹配所有 HTTP 方法的快捷方式,r.Any(),和一個可以匹配指定 HTTP 方法的快捷方式,r.Match()。

3.請求參數

接下來,我們介紹 Gin 框架怎么接收請求參數。我們按照請求參數的格式,分別介紹各種格式的請求參數的接收方式。

請求字符串

請求字符串(queryString)是請求地址中英文問號 ? 后面的參數,例如:

http://127.0.0.1:8080/user_info?username=frank

示例代碼:

HTTP 方法是 GET

package main

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

func main() {
 r := gin.Default()
 r.GET("/user_info", GetUserInfo)
 r.Run()
}

func GetUserInfo(c *gin.Context) {
 userName := c.Query("username")
 c.JSON(200, gin.H{
  "username": userName,
 })
}

輸出結果:

curl -s http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

Form 表單

HTTP 方法是 POST

package main

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

func main() {
 r := gin.Default()
 r.POST("/user_info", PostUserInfo)
 r.Run()
}

func PostUserInfo(c *gin.Context) {
 userName := c.PostForm("username")
 c.JSON(200, gin.H{
  "username": userName,
 })
}

輸出結果:

curl -s -X POST -d "username=frank" http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

JSON 字符串

以上示例代碼,都是使用默認 Content-Type Content-Type:application/x-www-form-urlencoded,當 Content-Type:application/json 時,我們需要使用 c.GetRawData() 方法接收請求參數,示例代碼:

package main

import (
 "encoding/json"
 "github.com/gin-gonic/gin"
)

func main() {
 r := gin.Default()
 r.POST("/user_info", JsonUserInfo)
 r.Run()
}

func JsonUserInfo(c *gin.Context) {
 // 定義 struct 或 map
 var m map[string]interface{}
 b, _ := c.GetRawData()

 _ = json.Unmarshal(b, &m)
 c.JSON(200, gin.H{
  "username": m["username"],
 })
}

輸出結果:

curl -s -H "Content-Type: application/json" -X POST -d '{"username":"frank"}' http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

以上幾種方式,是我們開發項目時比較常用的方式,但是,我們在使用以上幾種方式時,需要事先約定 Content-Type。

通用方式

所以 Gin 框架還有另外一種接收請求參數的方式,也就是使用 c.ShouldBind() 方法。

它可以通過檢查 HTTP Method 和 Content-Type 的值,自動將 quertString、form 表單、json 和 xml 的值解析到 struct。

示例代碼:

package main

import (
 "encoding/json"
 "github.com/gin-gonic/gin"
)

func main() {
 r := gin.Default()
 r.POST("/user_info", ShouldBindUserInfo)
 r.Run()
}

type UserInfo struct {
 Username string `form:"username" json:"username" xml:"username"`
}

func ShouldBindUserInfo(c *gin.Context) {
 var userInfo UserInfo
 _ = c.ShouldBind(&userInfo)
 c.JSON(200, gin.H{
  "username": userInfo.Username,
 })
}

輸出結果:

// application/json
curl -s -H "Content-Type: application/json" -X POST -d '{"username":"frank"}' http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

// application/xml
curl -s -H "Content-Type: application/xml" -X POST -d "<user_info><username>frank</username></user_info>" http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

// application/x-www-form-urlencoded
curl -s -X POST -d "username=frank" http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

// HTTP Method GET
curl -s http://127.0.0.1:8080/user_info\?username\=frank | jq
{
  "username": "frank"
}

需要注意的是,自定義結構體的標簽,不要漏掉。否則,將無法將請求參數的值解析到結構體中。

4.總結

本文我們介紹 Go 語言高性能 Web 框架 Gin 框架的路由和請求參數的一般使用方式,建議讀者朋友們動手運行文章中的示例代碼。

參考資料

[1] Gin 文檔: https://gin-gonic.com/zh-cn/docs/

[2] Gin 源碼: https://github.com/gin-gonic/gin/blob/master/context.go

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2024-04-28 10:17:30

gnetGo語言

2024-12-24 10:50:05

GinWeb開發

2023-12-26 00:58:53

Web應用Go語言

2024-11-25 08:14:09

Gin框架格式

2022-12-26 00:00:01

Go框架前端

2024-12-12 08:57:47

2020-11-23 10:48:39

Golang GinW

2025-01-13 13:00:00

Go網絡框架nbio

2025-01-13 12:23:51

2024-01-30 12:08:31

Go框架停止服務

2024-12-16 00:48:39

Gin框架函數

2023-03-06 08:37:58

JavaNIO

2024-02-19 07:40:10

2024-03-05 07:55:41

框架GINGo

2024-02-06 14:05:00

Go中間件框架

2022-08-15 08:01:35

微服務框架RPC

2021-10-27 11:29:32

框架Web開發

2019-03-29 15:34:39

Go框架Web

2020-06-17 16:43:40

網絡IO框架

2024-12-09 00:00:15

Gin框架中間件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区国产 | 欧美成人一区二免费视频软件 | 天天干夜夜操 | 日本久久精品视频 | 国产精品99久久久久久人 | 精品视频一区二区 | 一区二区在线观看免费视频 | 午夜专区| 青青久在线视频 | 亚洲男女激情 | 99re热精品视频 | 91精品国产91久久综合桃花 | 久久新视频| 欧美精品一区二区三区在线播放 | 日韩精品免费播放 | 在线观看欧美一区 | 日韩天堂av | 久热久草 | 福利精品在线观看 | 日本一区二区三区四区 | 日韩欧美在线观看视频 | 亚洲一区二区三 | 久久国产精品视频 | 久久成人在线视频 | 久久午夜精品福利一区二区 | 亚洲日本免费 | 日韩精品中文字幕一区二区三区 | 国产精品www | 精品亚洲一区二区三区 | 在线观看国产h | 久久精品国产精品青草 | 日韩视频在线免费观看 | 久久精品成人一区 | 欧美爱爱视频 | 欧美精品国产一区二区 | 国产精品精品视频一区二区三区 | av一区二区三区四区 | 久久久久久久综合 | 亚洲国产黄 | 国产乱码精品一区二区三区中文 | 7799精品视频天天看 |