แสดงหน้า HTML ด้วย Gin

ตัวอย่างง่ายๆ ที่แสดงวิธีการแสดงหน้าเทมเพลต HTML โดยใช้เว็บเฟรมเวิร์กยอดนิยม Gin ของภาษา Go (Golang)

Gin เป็นหนึ่งในเว็บเฟรมเวิร์กยอดนิยมสำหรับ Go ก่อนหน้านี้ฉันได้เขียนเกี่ยวกับวิธีการแสดงหน้า HTML โดยใช้แพ็คเกจเทมเพลต Go พื้นฐาน การแสดงเทมเพลต HTML นั้นง่ายยิ่งขึ้นด้วย Gin

ในการทำให้เวิร์กโฟลว์ราบรื่นยิ่งขึ้นและลองใช้แนวคิดใหม่ๆ และแก้ปัญหา ฉันยังตัดสินใจใช้ยูทิลิตี้การโหลดอัตโนมัติที่เรียกว่า Gin โดย Codegangsta


ข้อกำหนดเบื้องต้น


ข้อกำหนดสำหรับบทความนี้คือ คุณควรได้ทำตามบทความ ติดตั้ง Go บน Mac มาก่อน


สร้างโปรเจค gin-html


สร้างโปรเจคใหม่ ในตัวอย่างชื่อ gin-html สร้างไฟล์ main.go เปิดเทอร์มินัลแล้วใช้คำสั่ง

go mod init gin-html

คำสั่งนี้จะสร้างไฟล์ go.mod


การติดตั้ง Gin


การติดตั้งเฟรมเวิร์กเว็บ Gin HTTP นั้นตรงไปตรงมา เช่นเดียวกับแพ็คเกจ Go ส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด):

go get -u github.com/gin-gonic/gin

ไฟล์ main.go


package main

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

func main() {
	router := gin.Default()
	router.SetFuncMap(template.FuncMap{
		"upper": strings.ToUpper,
	})
	router.Static("/assets", "./assets")
	router.LoadHTMLGlob("templates/*.html")

	router.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"content": "This is an index page...",
		})
	})

	router.GET("/about", func(c *gin.Context) {
		c.HTML(http.StatusOK, "about.html", gin.H{
			"content": "This is an about page...",
		})
	})
	router.Run("localhost:8080")
}


The imports


ในบรรทัดที่ 4–7 เรานำเข้าบางแพ็คเกจ:

  • แพ็คเกจสำหรับเฟรมเวิร์กเว็บ Gin HTTP
  • แพ็คเกจพื้นฐานของ Go html/template สำหรับการนำเข้าฟังก์ชัน FuncMap() สิ่งนี้จำเป็นเมื่อใช้ฟังก์ชันภายในเทมเพลต
  • แพ็คเกจพื้นฐาน Go net/http สำหรับใช้กับ Gin
  • แพ็คเกจพื้นฐานของสตริง (strings) สำหรับฟังก์ชันระดับบนใน FuncMap


ฟังก์ชัน main()


ในบรรทัดที่ 11 เราสร้างเราเตอร์ Gin เริ่มต้นที่เรียกว่าเราเตอร์ เราเตอร์ Gin เริ่มต้นใช้มิดเดิลแวร์สำหรับบันทึกและกู้คืน นอกเหนือจากฟังก์ชันพื้นฐาน

ในบรรทัดที่ 12–14 จะใช้ SetFuncMap() เพื่อสร้างการแมปฟังก์ชันเพื่อใช้ในเทมเพลต ที่นี่เราเพียงแค่เพิ่มฟังก์ชันเทมเพลตอย่างง่ายที่เรียกว่า upper ซึ่งใช้ฟังก์ชัน strings.ToUpper() เพื่อตั้งค่าอักขระทั้งหมดในสตริงเป็นตัวพิมพ์ใหญ่

ในบรรทัดที่ 15 เราทำให้เราเตอร์ Gin ทราบว่าเราได้บันทึกทรัพย์สินแบบคงที่บางส่วนไว้ในไดเร็กทอรี ./assets Gin สามารถเข้าถึงทรัพย์สินแบบคงที่ในลักษณะนี้

ฉันได้ใส่เวอร์ชันย่อของไลบรารี Bulma CSS ในไดเร็กทอรีนั้นสำหรับตัวอย่างนี้ เมื่อใช้ฟังก์ชัน Static() เทมเพลต HTML จะถูกเปิดใช้งานเพื่อเข้าถึงไลบรารีนี้

คุณสามารถอ่านเอกสารสำหรับไลบรารี Bulma CSS ได้ ที่นี่

ในบรรทัดที่ 16 เทมเพลตทั้งหมดที่ตรงตามรูปแบบ template/*.html จะถูกโหลดโดยฟังก์ชัน LoadHTMLGlob() รูปแบบนี้หมายความว่าไฟล์เทมเพลตควรมีนามสกุล .html และอยู่ในไดเร็กทอรี /template

ในบรรทัดที่ 18–22 เราบอกให้เราเตอร์ Gin ยอมรับคำขอวิธี HTTP GET ที่เส้นทาง URL / เมื่อได้รับคำขอ Gin จะส่งข้อความสถานะ HTTP OK และแสดงผลเทมเพลต index.html พร้อมข้อมูลที่ให้ไว้ในวงเล็บปีกกา gin.H{} ในกรณีนี้ ข้อมูลจะประกอบด้วยคู่คีย์/ค่าเพียงคู่เดียว โดยมีคีย์เรียกว่าเนื้อหา

ในบรรทัดที่ 24–28 คล้ายคลึงกันข้างต้น เราบอกให้เราเตอร์ Gin ยอมรับคำขอเมธอด HTTP GET ที่พาธ /about คราวนี้มีการแสดงผลเทมเพลต about.html

ในบรรทัดที่ 29 เราบอกให้ Gin เรียกใช้เว็บเซิร์ฟเวอร์ที่พอร์ต localhost 8080


เทมเพลตและโครงสร้างไดเร็กทอรี


ด้านล่างนี้ คุณจะพบเทมเพลตสี่แบบที่ใช้ในตัวอย่างนี้ สิ่งเหล่านี้ต้องอยู่ในไฟล์ของตนเอง ชื่อไฟล์ถูกกล่าวถึงก่อนโค้ดแต่ละส่วน

ไวยากรณ์ของเทมเพลตเหมือนกับแพ็คเกจฐาน html/template คุณสามารถอ่านเพิ่มเติมเกี่ยวกับไวยากรณ์ในเทมเพลตได้ ที่นี่


ไฟล์ header.html


{{define "header.html"}}
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="stylesheet" type="text/css" href="/assets/bulma.min.css">
	<title></title>
</head>
<body>
<div class="container">
<br><br>
{{end}}

ไฟล์ footer.html


{{define "footer.html"}}
</div>
</body>

</html>
{{end}}

ไฟล์ index.html

{{template "header.html"}}
<h1 class="title">
	INDEX PAGE
</h1>
<p>{{ .content }}</p>
{{template "footer.html"}}

ไฟล์ about.html

{{template "header.html"}}
<h1 class="title">
	ABOUT PAGE
</h1>
<p>{{ .content | upper}}</p>
{{template "footer.html"}}

โหลด Gin อัตโนมัติ (Auto-reloading Gin)


ตามที่กล่าวไว้ก่อนหน้านี้ ฉันกำลังใช้ยูทิลิตี้ codegangsta/gin สำหรับการรีโหลด gin อัตโนมัติเมื่อทำการพัฒนา ทำให้ง่ายต่อการตรวจสอบผลลัพธ์ของโค้ดของเราในเบราว์เซอร์ เราสามารถทำได้โดยไม่ต้องหยุดโปรแกรมเรียกทำงานปัจจุบัน และสร้างใหม่ และเรียกใช้เมื่อเราเปลี่ยนโค้ด

นี่คือคำอธิบายของยูทิลิตี้จากหน้า Github:

gin เป็นยูทิลิตี้บรรทัดคำสั่งอย่างง่ายสำหรับการรีโหลดแอปพลิเคชันเว็บ Go แบบสด เพียงเรียกใช้ gin ในไดเร็กทอรีแอปของคุณ และเว็บแอปของคุณจะได้รับบริการโดยมี gin เป็นพร็อกซี่ gin จะคอมไพล์โค้ดของคุณใหม่โดยอัตโนมัติเมื่อตรวจพบการเปลี่ยนแปลง แอปของคุณจะรีสตาร์ทในครั้งต่อไปที่ได้รับคำขอ HTTP


ติดตั้ง codegangsta/gin


go get github.com/codegangsta/gin

การตรวจสอบผลลัพธ์ในเว็บเบราว์เซอร์


go run main.go

พิมพ์ข้อมูลต่อไปนี้ในช่อง URL ของเบราว์เซอร์ของคุณเพื่อตรวจสอบผลลัพธ์ของโค้ด

localhost:8080

…สำหรับหน้า index และ…

localhost:8080/about

สำหรับหน้า about

Leave a Reply

Your email address will not be published. Required fields are marked *