iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Software Development

你知道Go是什麼嗎?系列 第 14

Day14-Web-Golang

  • 分享至 

  • xImage
  •  

進入網頁相關的東西了,原本今天要介紹reflect,發現自己理解不來那是幹嘛的,所以直接先進Web吧!!


Net/Http

Go就提供了完整的http套件,其中也包含了GET、HEAD、POST、PUT、PATCH、DELETE、CONNECT、OPTION、TRACE等等相關的http方法,詳細可以從Go的官方文件看。

引入套件

第一步一定是import

import (
	"log"
	"net/http"
)
  • log通常是用來輸出錯誤訊息的。
  • net/http就是本次的主角,相關功能都在這套件內。

開始使用

這是一個傳送http要求的方法,可以看到方法內有兩個參數,responserequest

func test(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    io.WriteString(w, "Hello Web")
}
  • 第一行是對reponse內的header寫入StatusOK,這邊的數值以常數封裝在http套件內,可以從官網看到各項資料。本例的http.StatusOK200
  • 第二行是寫入response的內容。
func main() {
    http.HandleFunc("/", test)
    http.ListenAndServe(":8080", nil)
}
  • 第一部分是綁定路由routing,以本例來說是將上方test方法與根目錄/綁定,也就是網頁透過根目錄方問時會啟動test方法。
  • http.ListenAndServe開始建立服務,並監聽我們設定的埠,內有兩個參數分別是addresshandler
    • address: 本例設定了要監聽的port8080
    • handler: 本例沒有使用,因此是nil

成功執行後在127.0.0.1:8080即可看見顯示Hello Web的網頁了!

雖然上面那樣就成功了,但出錯時會完全沒有頭緒,因此需要設監聽錯誤的功能,log就派上用場了,將ListenAndServe()改成用下面的方法執行,在連線出問題時才會有錯誤提醒。

err := http.ListenAndServe(":8080", nil)
if err != nil {
	log.Fatal("ListenAndServe: ", err)
}

完整程式碼如下

package main

import (
	"log"
	"net/http"
	"io"
)

func test(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	io.WriteString(w, "Hello Web")
}
func main() {
	http.HandleFunc("/", test)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

使用html

由於上面的response只是回傳文字而已,想讓他長得像網頁的話,就要讓他回傳html格式的文字。

func test(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	str := `<!DOCTYPE html>
	<html>
	<head><title>首頁</title></head>
	<body><h1>首頁</h1><p>啦啦啦啦啦啦啦</p></body>
	</html>`
	io.WriteString(w, str)
}

直接在response內回傳html格式的文字,執行後就稍微看起來像網頁一點了。

但想想,不可能寫好html後還複製到response內去使用吧?一定得讓程式自己讀取html檔案才行,下面就試著這麼做吧。

Go讀取html檔案

要讀取html檔,首先要有個html檔吧,在跟main.go同一層目錄的位置隨意寫個index.html

<!DOCTYPE html>
<html lang="en">
<head>
     <title>Golang-test</title>
</head>
<body>
     <h1>Hello, web</h1>
</body>
</html>

有了html檔之後,再來就是去Go內部讀取了,要使用html檔會使用到html/template這個套件。

import (
	"html/template"
	"log"
	"net/http"
)

引入套件後再稍微改下程式碼。

func test(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	t := template.Must(template.ParseFiles("./index.html"))
	t.Execute(w, nil)
}
  • index.html為基礎建立一個template物件。
  • t.Execute()執行template物件,其中一個參數是response,第二個參數是用來傳動態資料的,本例沒有使用。

執行後就能在127.0.0.1:8080看見自己index.html的網頁。

動態調整

使用template的最主要用意是希望網頁能動態調整內容,讓網頁有點彈性,能夠隨著傳入的資料不同有不同的呈現。

首先要先更改index.html,找出我們要動態調整的地方。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <h1>{{.Title}}</h1>
    <p>{{.Content}}</p>
</body>
</html>

Go內也要跟著做點修正

type HtmlData struct{
    Title string
    Content string
}
func test(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    t := template.Must(template.ParseFiles("./index.html"))
    data := HtmlData{"大 大 大優惠","貓咪大戰爭~六周年~"}
    t.Execute(w, data)
}
  • 建立一個HtmlData的資料結構,儲存資料用
  • 多宣告了data並在執行時傳入

Go會自動將名稱一致的資料傳入,因此執行時就會看到網頁隨著傳入的資訊不同而變更了。


基本上透過Go內建的套件就能建立基本的網頁了,基礎的介紹完明天就來介紹Go裡面的Gin框架吧。

參考資料

Day4 | 無痛使用 Golang 打造屬於自己的網頁
https://ithelp.ithome.com.tw/articles/10233981

Go 建立一個簡單的 web 服務
https://willh.gitbook.io/build-web-application-with-golang-zhtw/03.0/03.2


上一篇
Day13 - Channel - Golang
下一篇
Day15 - Gin - Golang
系列文
你知道Go是什麼嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言