gin框架學習筆記(三) ——路由請求與相關參數

參數種類與參數處理

查詢參數

在講解查詢參數的定義之前,我們先來看一個例子,當我打開了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(刪除資源)等。
      無狀態:每個請求都包含足夠的信息來完成請求,服務器不需要保存任何上下文信息。
    • 統一接口:使用統一的接口來簡化客戶端與服務器之間的交互,包括資源標識符、資源操作和響應消息的格式。
    • 可緩存性:客戶端可以緩存響應,以提高性能和減少網絡流量。
      分層系統:將系統分為多個層次,每個層次處理特定的功能。

RESTful風格的API設計具有良好的可讀性、易用性和可擴展性,廣泛應用于Web應用程序和移動應用程序的API設計中。

四大請求方式

在上面有掛你參數的講解時我們就介紹了相關請求方式GETPUT,而其實除了它們以外,還有很多其他的對數據的操作方式,而今天我們主要介紹的就是四個比較常見的操作方式:

  • 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開發與云服務,所以對一些常見的知識點比如參數的定義,請求的方式,不對之處還請大家斧正,大家下篇見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12236.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12236.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12236.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【35分鐘掌握金融風控策略27】貸中風控策略與客戶運營體系

目錄 貸中風控策略與客戶運營體系 貸中風控日標 貸中風控數據源 貸中風控策略與客戶運營體系 貸中是風控的第二道防線,貸中階段風控的重點工作就是存量客戶風控及運營。在當下,新客市場趨于飽和且獲客成本越來越高,所以,在做好…

基于Java的俄羅斯方塊游戲的設計與實現

關于俄羅斯方塊項目源碼.zip資源-CSDN文庫https://download.csdn.net/download/JW_559/89300281 基于Java的俄羅斯方塊游戲的設計與實現 摘 要 俄羅斯方塊是一款風靡全球,從一開始到現在都一直經久不衰的電腦、手機、掌上游戲機產品,是一款游戲規則簡單…

物聯網設計競賽_1_邊緣人工智能云計算

邊緣人工智能: 本質上邊緣人工智能,直接會在邊緣設備上運行機器學習算法,例如物聯網設備或邊緣服務器上,這樣可以減少數據傳輸延遲,提高響應速度。 云計算: 云計算模型中,數據通常被發送到遠…

在React中利用Postman測試代碼獲取數據

文章目錄 概要名詞解釋1、Postman2、axios 使用Postman測試API在React中獲取并展示數據小結 概要 在Web開發中,通過API獲取數據是一項常見任務。Postman是一個功能強大的工具,可以幫助開發者測試API,并查看API的響應數據。在本篇博客中&…

【C語言】—— 動態內存管理

【C語言】——動態內存管理 一、動態內存管理概述1.1、動態內存的概念1.2、動態內存的必要性 二、 m a l l o c malloc malloc 函數2.1、函數介紹2.2、應用舉例 三、 c a l l o c calloc calloc 函數四、 f r e e free free 函數4.1、函數介紹4.2、應用舉例 五、 r e a l l o …

無列名注入

在進行sql注入時,一般都是使用 information_schema 庫來獲取表名與列名,因此有一種場景是傳入參數時會將 information_schema 過濾 在這種情況下,由于 information_schema 無法使用,我們無法獲取表名與列名。 表名獲取方式 Inn…

Redis——Redis集群腦裂問題

Redis集群的腦裂問題(Split-Brain)是一個在分布式系統中可能發生的嚴重問題,特別是在基于主從復制和哨兵(Sentinel)機制的Redis集群環境中。以下是對Redis集群腦裂問題的詳細闡述: 定義 Redis集群腦裂問題…

FullCalendar日歷組件集成實戰(3)

背景 有一些應用系統或應用功能,如日程管理、任務管理需要使用到日歷組件。雖然Element Plus也提供了日歷組件,但功能比較簡單,用來做數據展現勉強可用。但如果需要進行復雜的數據展示,以及互動操作如通過點擊添加事件&#xff0…

SwiftUI中的常用圖形(Shapes)

概述 在SwiftUI中,常用的圖形(Shape)主要有: Circle:圓形 Ellipse:橢圓形 Capsule:膠囊形 Rectangle:矩形 RoundedRectangle:圓角矩形 上面的這些圖形都繼承了Shape協議…

DFA算法 敏感詞過濾方案匯總以及高效工具sensitive-word

敏感詞過濾方案匯總以及高效工具sensitive-word 導入pom文件 <dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version>0.12.0</version> </dependency>接下來我們編寫相關測試類…

解四層負載和七層負載:Nginx 的應用示范

在網絡架構中&#xff0c;負載均衡是分配網絡或應用程序流量到多個服務器的技術&#xff0c;以優化資源使用、最大化吞吐量、最小化響應時間和避免任何單一資源的過載。Nginx&#xff0c;作為一款強大的HTTP和反向代理服務器&#xff0c;能夠處理七層&#xff08;應用層&#x…

深入剖析JVM、JDK和JRE的區別與聯系

在Java開發和運行過程中&#xff0c;JVM、JRE和JDK是三個核心組件。理解它們的區別和聯系是每個Java開發者的基礎技能。本文將深入探討這三個組件的作用、組成及其在實際應用中的重要性。 一、Java虛擬機&#xff08;JVM&#xff09; **JVM&#xff08;Java Virtual Machine&…

Hive讀寫文件機制

Hive讀寫文件機制 1.SerDe是什么&#xff1f; SerDe是Hive中的一個概念&#xff0c;代表著“序列化/反序列化” &#xff08;Serializer/Deserializer&#xff09;。 SerDe在Hive中是用來處理數據如何在Hive與底層存儲系統&#xff08;例如HDFS&#xff09;之間進行轉換的機制…

ceph糾刪碼精簡配置ec4+2:1與ec4+2的切換

概述 近期遇到項目&#xff0c;由于靈活配置&#xff0c;前期只有部分機器&#xff0c;后續擴容&#xff0c;想用ec42的糾刪碼&#xff0c;但前期只有3臺機器&#xff0c;需要做精簡ec。 erasure-code-profile 首先按照ceph創建糾刪碼池步驟進行操作。 創建ec42的rule cep…

2024國考行測、申論資料大全,做好備考真的很重要!

1. 國考是什么? 國考,全稱國家公務員考試,是選拔國家公務員的重要途徑。通過國考,你將有機會進入政府部門,為國家建設貢獻力量。 2. 國考難在哪里? 國考之所以難,主要體現在以下幾個方面: (1) 競爭激烈 每年國考報名人數都在百萬以上,而錄取率卻不足2%。千軍萬馬過獨木橋…

前端環境準備的一些注意事項

1. 安裝 node-sass4.x 需要python 2 和visual studio 2017&#xff0c;visual 2019版本不行。 2. python版本更新問題 python重新配置環境變量時&#xff0c;不會立馬生效&#xff0c;重啟可生效。 3. node版本問題 接觸一個新的項目&#xff0c;搞清楚node版本再開始準備…

node和npm版本太高導致項目無法正常安裝依賴以及正常運行的解決辦法:如何使用nvm對node和npm版本進行切換和管理

1&#xff0c;點擊下載 nvm 并且安裝 進入nvm的github&#xff1a; GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. 這里下載發行版&#xff0c;Releases coreybutler/nvm-windows GitHub 找到 這個 nv…

洗地機哪款好用?希亦、追覓、順造、米家等高品質洗地機推薦

家用洗地機已經成為家庭清潔的重要利器&#xff0c;其多功能性能幫助您輕松應對各種清潔任務&#xff0c;從而保持家居環境的清潔整潔。然而&#xff0c;市場上品牌繁多、功能各異的洗地機讓人眼花繚亂。為了幫助大家做出明智的選擇&#xff0c;我們將在本文中提供全面的選購指…

4.3 將AX寄存器中的16位數分成4組,每組4位,然后把這四組數分別放在AL,BL,CL和DL中

思路&#xff1a; 主要是通過SHR指令對AX寄存器進行移位&#xff0c;有個容易出錯的地方就是&#xff0c;當移位數超過1時&#xff0c;不能直接用指令SHR&#xff0c;而應該先將移位數存入CL&#xff0c;再使用指令SHR AH,CL。舉個例子&#xff1a; SHR AX,1 ;是可以的 SHR A…

選擇法(數值排序)(C語言)

一、運行結果&#xff1b; 二、源代碼&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//聲明排序函數sort; void sort(int a[], int n);int main() {//初始化變量值&#xff1b;int i, a[10];//填充數組&#xff1b;printf("請輸入10個整數\n&…