參數種類與參數處理
查詢參數
在講解查詢參數的定義之前,我們先來看一個例子,當我打開了CSDN,我現在想查看我的博客瀏覽量,那么我就需要點擊我的頭像來打開我的個人主頁,像下面這樣:
我們現在把瀏覽器的網址取下來,它是下面這樣的:
https://blog.csdn.net/qq_73924465?spm=1011.2415.3001.5343
我們嘗試來分析一下這個網址:
- https:表明這個是使用https網絡協議來通訊
- blog.csdn.net:這個指明了它的服務器地址
- qq_73924465:這個是路徑,也是我的id
那么?spm=1011.2415.3001.5343
這一部分內容是什么含義呢?我們要想一下,我點擊了我的頭像,服務器是怎么知道我是誰進而尋找到我的主頁,這就是查詢參數的作用了。
查詢參數(Query Parameters)通常指的是在網址(URL)中以問號(?)后跟著的一系列鍵值對,用于向服務器傳遞特定的信息或請求。這些參數以鍵值對的形式出現,每個鍵值對之間用"&"符號分隔。在Web開發中,查詢參數常用于向服務器發送請求,例如在搜索引擎中輸入關鍵詞時,這些關鍵詞通常會以查詢參數的形式附加在URL中,以便服務器根據這些參數返回相應的搜索結果。
而在Gin我們也有專門的方法去獲取查詢參數,我們來看下面這個例子:
package mainimport ("fmt""github.com/gin-gonic/gin"
)func getQuery(c *gin.Context) {fmt.Println(c.Query("name")) //獲取指定參數的值fmt.Println(c.QueryArray("name")) //獲取指定參數fmt.Println(c.DefaultQuery("name", "default")) //獲取指定參數,如果參數不存在,則返回默認值
}func main() {r := gin.Default()r.GET("/query", getQuery)r.Run(":8080")
}
這里我們以http://127.0.0.1:8080/query?name=id&name=user
為例,輸出結果:
動態參數
在我們請求中不止有查詢參數,還有一些其他的參數,其中就有動態參數,我們來看一下動態參數的定義:
動態參數是指在程序運行時可以接受并處理不同的參數,以影響其行為或輸出結果的機制。在 URL 中,動態參數通常作為 URL 的一部分,直接跟在路徑后面,以占位符的形式嵌入其中,例如 example.com/users/:userId 中的 :userId 就是動態參數。
它的作用在于使應用程序更加靈活和可配置。通過在 URL 中傳遞參數,可以動態地改變應用程序的行為或輸出結果,而無需修改代碼或重新部署應用程序。
下面我們將演示如何利用Gin框架來獲取動態參數:
package mainimport ("fmt""github.com/gin-gonic/gin"
)func _param(c *gin.Context) {fmt.Println(c.Param("user_name"))
}func main() {r := gin.Default()r.GET("/param/:user_name/", _param)r.Run(":8080")
}
這里我們嘗試發送請求:
**備注:**這里使用的是Postman
來模擬的請求
表單參數
在我們上網的過程中,我們有時候需要完善個人資料需要填寫下面這樣的資料表:
當我們填寫信息提交給服務端的時候,服務端就會從我們提交的表單中獲取相關信息,接下來我們將演示如何利用Gin框架來獲取表單參數:
package mainimport ("fmt""github.com/gin-gonic/gin"
)func _PostForms(c *gin.Context) {fmt.Println(c.PostForm("name"))fmt.Println(c.PostForm("age"))fmt.Println(c.DefaultPostForm("sex", "男"))
}func main() {r := gin.Default()r.POST("postforms", _PostForms)r.Run(":8080")
}
運行結果如下:
路由請求
Restful風格
RESTful風格是一種基于HTTP協議設計Web API的軟件架構風格,由Roy Fielding在2000年提出。它強調使用HTTP動詞來表示對資源的操作(GET、POST、PUT、PATCH、DELETE等),并通過URI表示資源的唯一標識符。
-
RESTful API的設計原則
RESTful API的設計遵循以下幾個原則:- 基于資源:將數據和功能抽象成資源,并通過URI來唯一標識資源。例 如,一個用戶資源可以通過URL“/users/{id}”來訪問,其中“{id}”表示該用戶的唯一標識符。
使用HTTP動詞:使用HTTP動詞來表示對資源的操作,如GET(獲取資源)、POST(創建資源)、PUT(更新資源)和DELETE(刪除資源)等。
無狀態:每個請求都包含足夠的信息來完成請求,服務器不需要保存任何上下文信息。 - 統一接口:使用統一的接口來簡化客戶端與服務器之間的交互,包括資源標識符、資源操作和響應消息的格式。
- 可緩存性:客戶端可以緩存響應,以提高性能和減少網絡流量。
分層系統:將系統分為多個層次,每個層次處理特定的功能。
- 基于資源:將數據和功能抽象成資源,并通過URI來唯一標識資源。例 如,一個用戶資源可以通過URL“/users/{id}”來訪問,其中“{id}”表示該用戶的唯一標識符。
RESTful風格的API設計具有良好的可讀性、易用性和可擴展性,廣泛應用于Web應用程序和移動應用程序的API設計中。
四大請求方式
在上面有掛你參數的講解時我們就介紹了相關請求方式GET
與PUT
,而其實除了它們以外,還有很多其他的對數據的操作方式,而今天我們主要介紹的就是四個比較常見的操作方式:
Get
:從服務器取出資源(一項或多項)Post
:在服務器上新建一個資源Put
:在服務器上更新資源Delete
:從服務上刪除資源
接下來我們將以一個事例的方式來演示我們如何倆處理不同的需求:
package mainimport ("encoding/json""fmt""github.com/gin-gonic/gin"
)type ArticleModel struct {Title string `json:"title"`Content string `json:"content"`
}type Response struct {Code int `json:"code"`Data any `json:"data"`Message string `json:"message"`
}func _bindJson(c *gin.Context, obj any) (err error) { //從請求中獲取 JSON 數據并將其綁定到指定的對象body, _ := c.GetRawData()contnttype := c.GetHeader("Content-Type")switch contnttype {case "application/json":err := json.Unmarshal(body, &obj)if err != nil {fmt.Println("err:", err)return err}}return nil
}// 文章列表頁面
func _getList(c *gin.Context) {aricleList := []ArticleModel{{"Go語言入門", "這本書是《Go語言入門》"},{"100天從0精通python", "這本書是《100天從0精通python》"},{"C++ Primer", "這本書是《C++ Primer》"},}c.JSON(200, Response{0, aricleList, "成功"})
}// 獲取文章詳情
func _getDetail(c *gin.Context) {fmt.Println(c.Param("id"))article := ArticleModel{"Go語言入門","這本書是《Go語言入門》",}c.JSON(200, Response{0, article, "成功"})
}// 創建一篇文章
func _create(c *gin.Context) {var article ArticleModelerr := _bindJson(c, &article)if err != nil {fmt.Println(err)return}c.JSON(200, Response{0, article, "成功"})
}// 更新文章內容
func _update(c *gin.Context) {var article ArticleModelerr := _bindJson(c, &article)if err != nil {fmt.Println(err)return}c.JSON(200, Response{0, article, "成功"})
}func _delete(c *gin.Context) {fmt.Println(c.Param("id"))c.JSON(200, Response{0, map[string]string{}, "成功"})
}func main() {r := gin.Default()r.GET("/articles", _getList)r.GET("/articles/:id", _getDetail)r.POST("/articles", _create)r.PUT("/articles/:id", _update)r.DELETE("/articles/:id", _delete)r.Run(":8080")
}
運行這個程序,我們利用Postman
來嘗試模擬一下這些請求:
這里就不一一展示了,大家有興趣的話可以自己來試試。
請求頭與響應頭
什么是請求頭與響應頭
請求頭和響應頭都是HTTP消息頭的一部分,它們是在HTTP通信過程中用于傳遞元數據的重要組成部分。
-
請求頭(Request Headers):
- 請求頭包含了客戶端(例如瀏覽器、移動應用等)向服務器發送的請求的元數據信息。
- 請求頭通常包括了諸如客戶端的User-Agent、Accept、Content-Type等信息,用于告知服務器請求的相關信息。例如,瀏覽器發送HTTP請求時,請求頭中可能包含了用戶代理信息、所能接受的數據類型、請求的方法(GET、POST等)等。
-
響應頭(Response Headers):
- 響應頭包含了服務器響應客戶端請求時發送的元數據信息。
- 響應頭通常包括了諸如服務器類型、響應的數據類型、響應的狀態碼等信息,用于告知客戶端關于響應的詳細信息。例如,當服務器響應瀏覽器的HTTP請求時,響應頭中可能包含了服務器類型、響應的數據類型、響應的狀態碼等。
獲取請求頭與響應頭
在Gin框架中,定義了它自己的方法區獲取請求頭與響應頭,接下來我們演示一下我們如何基于Gin框架來獲取請求頭與響應頭:
import ("fmt""github.com/gin-gonic/gin"
)// 獲取響應頭
func Request(c *gin.Context) {fmt.Println(c.Request.Header.Get("user-agent")) //這里不需要考慮大小寫的問題,Get函數會做相關處理c.JSON(200, gin.H{"msg": "ok"})
}// 設置響應頭
func Response(c *gin.Context) {c.Header("token", "test")c.JSON(200, gin.H{"msg": "ok"})
}func main() {r := gin.Default()r.GET("/request", Request)r.GET("/response", Response)r.Run(":8080")
}
運行結果如下:
結語
好了,本次的內容就到此為止了,下一篇我們將介紹的就是參數綁定與中間件的使用了,博主平時其實主要還是寫cpp,學go其實主要也是想通過這個學習Web開發與云服務,所以對一些常見的知識點比如參數的定義,請求的方式,不對之處還請大家斧正,大家下篇見!