Go 言語の gin フレームワーク [GET/POST] 値を受け取り、渡すためのリクエスト パラメーター (5)

Gin の get と post は、HTTP リクエストの異なるメソッドを参照します。クライアントがサーバーに対して HTTP GET リクエストを開始すると、サーバーは対応するリソースをクライアントに返します。クライアントがサーバーに対して HTTP POST リクエストを開始すると、サーバーはリクエストの一部としてクライアントによって送信されたデータを処理します。 。

 

Gin は Go 言語で書かれた Web フレームワークで、HTTP GET リクエストと HTTP Post リクエストをサポートします。通常、HTTP GET はデータまたはリソースをリクエストするために使用され、HTTP POST は Web フォームなどのサーバーにデータを送信するために使用されます。

Gin では、次のコードのように、GET メソッドを使用して HTTP Get リクエストのハンドラーを宣言できます。

package main

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

func main() {
    r := gin.Default()

    r.GET("/hello", func(c *gin.Context) {
        c.String(200, "Hello, Gin!")
    })

    r.Run() // 启动服务器
}

上記の例では、HTTP Get リクエストのハンドラーを宣言しており、そのルーティング パスは「/hello」です。クライアントが「/hello」の GET リクエストをサーバーに送信すると、このハンドラーが実行されます。

ここでの Get リクエストはパラメータなしの場合です。実際の業務ではさまざまなリクエストが存在する可能性があります。そのため、 (localhost:8080/login?username= "xiaomi"&password="123456) のようなGETリクエストが他にもあることをここに付け加えておきます。") このような URL リンクにアクセスする場合、ルーティング内の値をどのように取得しますか?

つまり、サーバーは URL リンク上のパラメータをどのように受信するのでしょうか?

Gin では、Param メソッドまたは Query メソッドを使用して、URL 内のクエリ パラメーターを取得できます。Param メソッドはパス パラメーターを取得でき、Query メソッドはクエリ パラメーターを取得できます。

例えば:

package main

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

func main() {
    r := gin.Default()

    // /book/123  动态路由
    r.GET("/book/:id", func(c *gin.Context) {
        id := c.Param("id")
        c.String(200, "Book ID is "+id)
    })

    // /search?query=gin  路由携带参数
    r.GET("/search", func(c *gin.Context) {
        query := c.Query("query")
        c.String(200, "Search query is "+query)
    })

    r.Run()
}

上記の例では、Param メソッドを使用してパス パラメーターを取得し、 ":id"でパラメーター名を指定し、プロセッサー関数で c.Param("id") を使用してパラメーター値を取得し、最後にそれを返します。クライアント。また、Query メソッドを使用してクエリ パラメーターを取得し、"c.Query("query")" を使用して "query" という名前のパラメーター値を取得し、最後にそれをクライアントに返します。 

ここで注意する必要があるのは、Param() メソッドQuery()メソッドの最初の文字はすべて大文字であるということです。

[ c *gin.Context ] c オブジェクトの組み込みメソッド。

さらに、次のコードのように、POST メソッドを使用して HTTP Post リクエストのハンドラーを宣言することもできます。

package main

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

func main() {
    r := gin.Default()

    r.POST("/login", func(c *gin.Context) {
        username := c.PostForm("username")
        password := c.PostForm("password")

        // 进行用户验证操作

        c.String(200, "登录成功!")
    })

    r.Run() // 启动服务器
}

上記の例では、HTTP Post リクエストのハンドラーを宣言しており、そのルーティング パスは「/login」です。クライアントが「/login」に対する POST リクエストをサーバーに送信すると、このハンドラーが実行されます。プロセッサでは、クライアントから送信されたフォーム データをc.PostForm メソッドを通じて取得し、それに応じて処理できます。

補足説明すると、postリクエストがログインリクエストや登録リクエストを模擬した場合、構造体のデータとなるので、リクエストc.request.bodyからリクエストパラメータを取得してクライアントに返す必要があります(成功かどうかは関係ありません)。このようなステータスは、実際の開発環境と一致するように同じ方法で処理する必要があります)。以下の場合:

package main

import (
	"net/http"

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

// 定义一个 userinfo 表单结构体对象
type UserInfo struct {
	UserName string `json:"username" form:"username"`
	Password string `json:"password" form:"password"`
	Age      string `json:"age" form:"age"`
}

func main() {
	// 定义一个路由引擎对象
	router := gin.Default()

	// 加载 渲染模板 全局
	router.LoadHTMLGlob("*templates/**/*")

	// 路由 get请求后 返回数据到模板渲染
	router.GET("/", func(c *gin.Context) {
		// c.JSON(200, gin.H{
		// 	"message": "Hello, world!",
		// })
		c.HTML(http.StatusOK, "login/index.html", gin.H{
			"title":   "登录页面",
			"content": "这是一个",
		})
	})

	// get请求 c.Query()方法获取url【/login?usename="小红"&password="123123"】 上的参数值:
	router.GET("/login", func(c *gin.Context) {
		username := c.Query("username")
		password := c.Query("password")
		// c.DefaultQuery()方法可以设定默认值,触发的条件是如果获取不到url上这个age参数的值,就返回约定的默认值18
		age := c.DefaultQuery("age", "18") // 18 is default value for login form auth form auth

		// 获取到url传入的参数跳转到 新的页面 首页 渲染到、default/index.html
		c.HTML(http.StatusOK, "default/index.html", gin.H{
			"name":     username,
			"password": password,
			"age":      age,
		})
	})

	// GET / 动态路由链接  /logout/1233 其中的1233是这个url上的动态变量值,默认取值就是uid
	router.GET("/logout/:uid", func(c *gin.Context) {
		uid := c.Param("uid") // 获取动态路由url链接上的变量值 /logout/1233 这里的值为1233
		status := "登出成功"
		// c.String(http.StatusOK, "uid=%v 状态=%v", uid, status)
		c.JSON(http.StatusOK, gin.H{
			"status": status,
			"uid":    uid,
		})
	})

	// 赋值结构体
	router.GET("/register", func(ctx *gin.Context) {
		// ctx.String(http.StatusOK,"成功!!")
		ctx.HTML(http.StatusOK, "register/index.html", gin.H{})

	})
	router.POST("/doAdd", func(ctx *gin.Context) {
		// post请求通过 c.PostForm()方法获取表单数据
		// username := ctx.PostForm("username")
		// password := ctx.PostForm("password")
		// age := ctx.DefaultPostForm("age", "20")
		// ctx.JSON(http.StatusOK, gin.H{
		// 	"username": username,
		// 	"password": password,
		// 	"age":      age,
		// })

		// post请求 通过  ctx.ShouldBind(&userInfo) 方法  结构体赋值
		userInfo := &UserInfo{}
		if err := ctx.ShouldBind(&userInfo); err == nil {
			ctx.JSON(http.StatusOK, gin.H{
				"userInfn": userInfo,
			})
		} else {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}
	})

	router.Run(":8080")
}

このうち、HTML ページのデフォルト、ログイン、フォルダーの登録などは画像ファイルの構造のみを示しています。

{
   
   {define "register/index.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册页面</title>
</head>
    <h1>{
   
   {"注册页面"}}</h1>
    <form action="/doAdd" method="post">
        用户名 <input type="text" name="username" id="username">
        密码 <input type="text" name="password" id="password">
        年龄  <input type="text" name="age" id="age">
        <input type="submit" value="提交">
    </form>
</body>
</html>
{
   
   {end}}

メソッドを使用して、 ShouldBind リクエスト内のデータを構造体オブジェクトにバインドできます。リクエストボディが JSON 形式のデータであると仮定すると、それを構造体オブジェクトにバインドできます。手順は次のとおりです。

1. 構造を定義する

type User struct {
    Name     string `json:"name"`
    Age      int    `json:"age"`
    Password string `json:"password"`
}

2. 使用ShouldBind 方法

func handlePostRequest(c *gin.Context) {
    var user User
    if err := c.ShouldBind(&user); err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.JSON(http.StatusOK, gin.H{
        "name":     user.Name,
        "age":      user.Age,
        "password": user.Password,
    })
}

User上記の例では、リクエストボディ内のデータ形式を表す構造体が定義されています 。次に、 ShouldBind メソッドを使用してリクエスト本文データを User オブジェクトにバインドし、バインドが失敗するかどうかを判断します。

ShouldBind このメソッドは、さまざまな Content-Type に応じてさまざまなタイプのバインディングを自動的に実行でき、JSON、XML、および Form の 4 つのデータ タイプをサポートします。Bind using メソッドとは異なり、using ShouldBind メソッドが失敗した場合、例外はスローされませんが、エラー オブジェクトが返されることに注意してください 。例外をスローする必要がある場合は、 ShouldBindJSON または ShouldBindXML メソッドを使用できます。

さらに、 ShouldBindUri メソッドを使用して URL 内のデータを構造オブジェクトにバインドすることもできます。このメソッドは ShouldBind メソッドと同様に使用されます。例えば:

func handleGetRequest(c *gin.Context) {
    var user User
    if err := c.ShouldBindUri(&user); err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.JSON(http.StatusOK, gin.H{
        "name": user.Name,
        "age":  user.Age,
    })
}

上記の例では、 ShouldBindUri メソッドを使用して URL 内のデータを User オブジェクトにバインドし、 User オブジェクト内のデータの一部をクライアントに返します。

これは簡単な登録のための最終的な HTML コードです。リソースにアクセスしてダウンロードできます。

上記は、Gin フレームワークを使用して post リクエストと get リクエストを実行するための基本的な手順です。これらの基礎知識を学ぶことで、さらにルーティングジャンプなどの高度な機能の使い方を学び、より実践的なニーズに応えることができます。 

おすすめ

転載: blog.csdn.net/A_LWIEUI_Learn/article/details/131221914