以下では、戻り値の型について説明します。
- [ ]バイト和文字列
- JSON形式
- HTMLテンプレートのレンダリング
- 静的リソースの設定
バックグラウンド
これまでのコースでは、複数の種類のネットワーク要求と処理を学習して習得し、データの送信と構造のバインディングの操作も習得しました。完全なリクエストには、リクエスト、リクエストの処理、結果の返却という 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>