gin 網(wǎng)絡請求與路由處理
我們介紹了Gin框架,并做了Gin框架的安裝,完成了第一個Gin工程的創(chuàng)建。
創(chuàng)建Engine
在gin框架中,Engine被定義成為一個結構體,Engine代表gin框架的一個結構體定義,其中包含了路由組、中間件、頁面渲染接口、框架配置設置等相關內容。默認的Engine可以通過gin.Default進行創(chuàng)建,或者使用gin.New()同樣可以創(chuàng)建。兩種方式如下所示:
engine1 := gin.Default()
engine2 := gin.New()
gin.Default()和gin.New()的區(qū)別在于gin.Default()也使用gin.New()創(chuàng)建engine實例,但是會默認使用Logger和Recovery中間件。
- Logger是負責進行打印并輸出日志的中間件,方便開發(fā)者進行程序調試
- Recovery中間件的作用是如果程序執(zhí)行過程中遇到panic中斷了服務,則Recovery會恢復程序執(zhí)行,并返回服務器500內部錯誤。通常情況下,我們使用默認的gin.Default創(chuàng)建Engine實例。
處理HTTP請求
在創(chuàng)建的engine實例中,包含很多方法可以直接處理不同類型的HTTP請求。
HTTP請求類型
http協(xié)議中一共定義了八種方法或者稱之為類型來表明對請求網(wǎng)絡資源(Request-URI)的不同的操作方式,分別是:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT。
雖然一共有八種請求操作類型,但是實際開發(fā)中常用的GET POST DELETE等幾種。
get表示從網(wǎng)絡上獲取一種網(wǎng)絡資源,post表示要向服務器提交一段數(shù)據(jù),往往在使用的過程當中是在某個網(wǎng)頁當中有一個表單數(shù)據(jù)提交的時候使用post。delete是在刪除資源的時候執(zhí)行。
如果要攜帶數(shù)據(jù),會放在body當中,這樣會將攜帶數(shù)據(jù)的名稱和相應的數(shù)據(jù)在這里面填入就行了。?
通用處理
engine中可以直接進行HTTP請求的處理,在engine中使用Handle方法進行http請求的處理。Handle 方法包含三個參數(shù),具體如下所示:
func (group *RouterGroup) Handle(httpMethod string, relativePath string, handlers ...HandlerFunc) IRoutes
- httpMethod:第一個參數(shù)表示要處理的HTTP的請求類型,是GET、POST、DELETE等8種請求類型中的一種。
- relativePath:第二個參數(shù)表示要解析的接口,由開發(fā)者進行定義。
- handlers:第三個參數(shù)是處理對應的請求的代碼的定義。
?handler處理GET請求??DefaultQuery、Query
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
// 使用handle方法處理/hello這樣一個請求
func main() {
//創(chuàng)建engine引擎對象
engine := gin.Default()
//請求路徑 http://localhost:8080/hello?name=lucas 帶參數(shù)name
//匿名函數(shù)處理http的請求,context為請求上下文,攜帶一些屬性和方法
engine.Handle("GET", "/hello", func(c *gin.Context) {
path := c.FullPath() //請求的接口
fmt.Println(path)
//獲取參數(shù),最后一個參數(shù)是獲取不到時候的默認值為hello
name := c.DefaultQuery("name", "hello")
fmt.Println(name)
//輸出,處理完請求之后需要返回結果給前端
c.Writer.Write([]byte("hello " + name))
})
engine.Run(":8000")
}
/hello
lucas
[GIN] 2023/04/25 - 10:53:09 | 200 | 333.7μs | 127.0.0.1 | GET "/hello?name=lucas"
/hello
hello
[GIN] 2023/04/25 - 10:54:11 | 200 | 0s | 127.0.0.1 | GET "/hello"
通過Handle方法第一個參數(shù)指定處理GET類型的請求,解析的接口是/hello。
Context是gin框架中封裝的一個結構體,這是gin框架中最重要,最基礎的一個結構體對象。
該結構體可以提供我們操作請求,處理請求,獲取數(shù)據(jù)等相關的操作,通常稱之為上下文對象,簡單說為我們提供操作環(huán)境。
可以通過context.Query和context.DefaultQuery獲取GET請求攜帶的參數(shù)。可以通過context.Writer.Write向請求發(fā)起端返回數(shù)據(jù)。
handler處理post請求??PostForm
//post http://localhost:8080/login
//post請求攜帶數(shù)據(jù)不和get上面一樣,而是放在請求的body里面,也就是請求體里面
engine.Handle("POST", "/login", func(c *gin.Context) {
path := c.FullPath() //請求的接口
fmt.Println(path)
//獲取post表單當中數(shù)據(jù)的哪一個字段
username := c.PostForm("username")
password := c.PostForm("password")
fmt.Println("username:", username, "password:", password)
c.Writer.Write([]byte("username:" + username))
})
如上的案例,通過第一個參數(shù)指定了解析POST類型的請求,第二個參數(shù)指定解析的接口為/login。POST請求是以form表單的方式提交數(shù)據(jù)的,可以通過context.PostForm獲取表單中提交的數(shù)據(jù)字段。
其他類型的HTTP請求也可以通過Handle方法處理對應類型的請求。
分類處理? 路由
除了engine中包含的通用的處理方法以外,engine還可以按類型進行直接解析。engine中包含有get 方法、post方法、delete方法等與http請求類型對應的方法。
engine.GET() 處理GET請求
engine中包含GET方法處理HTTP的GET類型的請求。engine的GET方法包含兩個參數(shù),編程使用如下所示:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
//http://127.0.0.1/hello?name=lucas
engine.GET("/hello", func(c *gin.Context) {
fmt.Println(c.FullPath())
//查詢攜帶的字段名稱,這個沒有默認返回參數(shù)
name := c.Query("name")
fmt.Println("name:", name)
c.Writer.Write([]byte("name is:" + name))
})
engine.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
/hello
name: lucas
[GIN] 2023/04/26 - 09:06:37 | 200 | 297.4μs | 127.0.0.1 | GET "/hello?name=lucas"
/hello
name:
[GIN] 2023/04/26 - 09:07:12 | 200 | 950.7μs | 127.0.0.1 | GET "/hello?name1=lucas"
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
engine.POST("/login", func(c *gin.Context) {
fmt.Println(c.FullPath())
if name, exits := c.GetPostForm("username"); exits {
fmt.Println("username is:", name)
}
if password, exits := c.GetPostForm("password"); exits {
fmt.Println("password is:", password)
}
})
engine.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
/login
username is: lucas
password is: 123456
[GIN] 2023/04/26 - 09:13:34 | 200 | 1.5881ms | 127.0.0.1 | POST "/login"
?在解析接口的這個地方,通過:自定義變量的值,:id表示變量的值
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
engine.DELETE("/user/:id", func(c *gin.Context) {
userID := c.Param("id")
fmt.Println("userid is:", userID)
})
engine.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
userid is: 24
[GIN] 2023/04/26 - 10:05:25 | 200 | 0s | 127.0.0.1 | DELETE "/user/24"
上面介紹了最常用的兩種http處理請求的方式文章來源:http://www.zghlxwxcb.cn/news/detail-429615.html
- 一種是使用handler處理,需要指定具體的請求類型
- 其次是路由的方法post delete這種進行響應接口類型的處理。
上面同時也介紹了如何獲取客戶端提交的數(shù)據(jù)。post get delete.............................。?文章來源地址http://www.zghlxwxcb.cn/news/detail-429615.html
到了這里,關于Golang Gin HTTP 請求和參數(shù)解析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!