Golang Gin はリクエスト結果を複数のデータ形式で返します

以下では、戻り値の型について説明します。

  1. [ ]バイト和文字列
  2. JSON形式
  3. HTMLテンプレートのレンダリング
  4. 静的リソースの設定

バックグラウンド


これまでのコースでは、複数の種類のネットワーク要求と処理を学習して習得し、データの送信と構造のバインディングの操作も習得しました。完全なリクエストには、リクエスト、リクエストの処理、結果の返却という 3 つのステップが含まれていることはよく知られており、サーバーがリクエストの処理を完了する、結果がクライアントに返されます。

gin フレームワークでは、複数のリクエスト データ形式がサポートされています。

[ ]バイト


これまでのコースのケースでは、一律に使用したリクエストの戻りデータの形式は [ ] バイトでした。context、Writer、および Write メソッドを通じて [ ] バイトのデータを書き込みます。コード化されたケースは次のようになります。

package main

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

func main() {
	engine := gin.Default()
	engine.GET("/byte", func(c *gin.Context) {
		fullPath := c.FullPath()
		c.Writer.Write([]byte(fullPath))
	})
	engine.Run()
}

 弦


	engine.GET("/string", func(c *gin.Context) {
		fullPath := c.FullPath()
		c.Writer.WriteString(fullPath)
	})

ここで、writer はコンテキスト構造内の属性であり、type は ResponseWriter のタイプです。

type Context struct {
    writermem    responseWriter
    Request      *http.Request
    Writer       ResponseWriter
}

ResponseWriter は、go 標準ライブラリ http パッケージの下にある http.ResponseWriter を含むインターフェイス タイプであり、ここには一連のメソッドがあります。上記で使用した c.Writer メソッドは http.ResponseWriter 配下のメソッドです。

type ResponseWriter interface {
    http.ResponseWriter
    http.Hijacker
    http.Flusher
    http.CloseNotifier
    Status() int
    Size() int
    WriteString(string) (int, error)
    Written() bool
    WriteHeaderNow()
    Pusher() http.Pusher
}

JSON


context.Writer オブジェクトを使用してバイト型および文字列型のデータを返すことに加えて。プロジェクト開発では、JSON 形式の仕様がより一般的に使用されます。開発者がプロ​​ジェクト開発にフレームワークを使いやすくするために、gin は返されたデータを JSON 形式に組み立てて返すことを直接サポートしています。

gin フレームワークのコンテキストに含まれる JSON メソッドは、構造体型のデータを JSON 形式の構造化データに変換してクライアントに返すことができます。

以下に 2 つの方法を示します。1 つはマップ型データを json に変換する方法、もう 1 つは構造型を通じて json 形式に変換することもできます。

マップ タイプのプログラミング呼び出しは次のとおりです。

	engine.GET("/map", func(c *gin.Context) {
		fullPath := c.FullPath()
		c.JSON(http.StatusOK, map[string]interface{}{
			"code": 1,
			"msg":  "ok",
			"data": fullPath,
		})
	})

このようにして、最も単純なマップ型のデータ形式が json に変換されてフロントエンドに返されます。

構造体型のプログラミング呼び出しは次のとおりです。

実際のプロジェクト開発では、多くの構造体が存在することが多く、構造体の値の型に対応するデータをフロントエンドに直接返す必要があります。

通常、コード、メッセージ、データの 3 つのデータ定義は、レスポンスなどの一般的な構造として使用されます。

package main

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

func delStructHandler(c *gin.Context) {
	fullPath := "请求路径" + c.FullPath()
	resp := Response{
		Code:    1,
		Message: "ok",
		Data:    fullPath,
	}
	c.JSON(http.StatusOK, &resp)
	//第二个参数是interface类型,这里需要取值类型的地址
}

type Response struct {
	Code    int
	Message string
	Data    interface{} //由于类型不确定,那么使用万能类型,interface类型
}

func main() {
	engine := gin.Default()
	engine.GET("/struct", delStructHandler)
	engine.Run()

}

 

 

HTML


gin フレームワークでは、HTML ページまたは HTML テンプレートの直接読み込みがサポートされているため、フロントエンドでレンダリングできます。

ここでは、まず html ディレクトリを作成し、その下にすべての html ファイルを配置する必要があります。Gin はこれらのファイルを使用する前にロードする必要があります。

package main

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

func htmlHandler(c *gin.Context) {
	c.HTML(http.StatusOK, "index.html", nil)
	//第二个参数是interface类型,这里需要取值类型的地址
}

func main() {
	engine := gin.Default()
	//指明要加载的html文件所在的目录,这样就将html目录下面所有的文件可以让gin访问
	engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*")
	engine.GET("/html", htmlHandler)
	engine.Run()
}

 この HTML ページはバックグラウンド サーバーから HTML ページにデータを返すことができますか?

これには、テンプレート言語の使用が必要です。表示のために変数を Index.html ページに渡すには、テンプレート言語を使用して HTML ページ内で変数を定義する必要があります。二重中括弧 + 変数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>gin学习</h1>
{
   
   {.fullPath}}
</body>
</html>

 このページで定義されている

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{
   
   {.title}</title>
</head>
<body>
<h1>gin学习</h1>
{
   
   {.fullPath}}
</body>
</html>

 -------------------------------------------------- -------------------------------------------------- ---------------------

package main

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

func htmlHandler(c *gin.Context) {
	fullPath := c.FullPath()
	c.HTML(http.StatusOK, "index.html", gin.H{
		"fullPath": fullPath,
		"title":    "gin学习",
	})
	//这样就将服务器端的变量传递到html页面当中了
}

func main() {
	engine := gin.Default()
	//指明要加载的html文件所在的目录,这样就将html目录下面所有的文件可以让gin访问
	engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*")
	engine.GET("/html", htmlHandler)
	engine.Run()

}

以上がhtmlのテンプレート言語を利用したデータ転送とデータ表示です。

静的画像をロードする


開発プロセス中、同じ種類のリソースが同じディレクトリに作成されることがよくあります。

gin フレームワークは、静的リソースをロードするときに、最初に静的リソースのディレクトリを設定する必要があります。

package main

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

func htmlHandler(c *gin.Context) {
	fullPath := c.FullPath()
	c.HTML(http.StatusOK, "index.html", gin.H{
		"fullPath": fullPath,
		"title":    "gin学习",
	})
	//这样就将服务器端的变量传递到html页面当中了
}

func main() {
	engine := gin.Default()
	//指明要加载的html文件所在的目录,这样就将html目录下面所有的文件可以让gin访问
	engine.LoadHTMLGlob("C:\\Users\\W10\\GolandProjects\\day1\\gin\\bilibli\\html\\*")

	//第一个参数代表客户端请求的http路径,第二个参数表示本地工程的路径
	engine.Static("/img", "../image")
	engine.GET("/html", htmlHandler)
	engine.Run()

}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{
   
   {.title}}</title>
</head>
<body>
<h1>gin学习</h1>
{
   
   {.fullPath}}
<div align="center">
<img src="C:\Users\W10\GolandProjects\day1\gin\bilibli\image\test.jpg">
</div>
</body>
</html>

おすすめ

転載: blog.csdn.net/qq_34556414/article/details/130508610