用原生Go寫一個自己的部落格-搭建專案(一)

LiberHome 發表於 2022-07-13
Go
  • 可以在環境中設定代理goproxy.cn避免國內下包出錯

啟動服務

最開始可以先對一個埠18080啟動一個服務:

package main

import (
    "log"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {

}

func main() {
    //    啟動一個http服務 指明ip和埠
    server := http.Server{
        Addr: "127.0.0.1:18080",
    }
    //響應訪問http://localhost:18080/的請求
    http.HandleFunc("/", index)
    //    監聽對應的埠 & 啟動服務
    if err := server.ListenAndServe(); err != nil {
        log.Println(err)
    }
}

效果:
用原生Go寫一個自己的部落格-搭建專案(一)沒有404。

新增localhost:18080/響應

接下來,我們在index這個func可以新增響應:

func index(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hey this is LiberHom"))
}

傳遞json資料

當然,實際開發一般不會是這麼簡單的文字,而是一些web頁面,需要給前端返回json資訊,我們需要在Header中指明是json。

func index(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte("hey this is LiberHom"))
}

效果:
用原生Go寫一個自己的部落格-搭建專案(一)
我們可以構造完整一些的例子如下:

package main

import (
    "encoding/json"
    "log"
    "net/http"
)

//構造一些資料
type IndexData struct {
    Title string `json:"title"`
    Desc  string `json:"desc"`
}

func index(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var indexData IndexData
    indexData.Title = "Liber-Blog"
    indexData.Desc = "this is the desc part"
    //把結構體例項轉成對應的json
    jsonStr, _ := json.Marshal(indexData)
    w.Write(jsonStr)
}

func main() {
    //    啟動一個http服務 指明ip和埠
    server := http.Server{
        Addr: "127.0.0.1:18080",
    }
    //響應訪問http://localhost:18080/的請求
    http.HandleFunc("/", index)
    //    監聽對應的埠 & 啟動服務
    if err := server.ListenAndServe(); err != nil {
        log.Println(err)
    }
}

執行結果如下:
用原生Go寫一個自己的部落格-搭建專案(一)

新增localhost:18080/index.html響應

伺服器不僅可以返回簡單的json資料,還可以直接返回html頁面,目前我們新建一個資料夾template,資料夾中建一個index.html檔案,現在我想在伺服器中返回這個html檔案可以這麼做:

package main

import (
    "encoding/json"
    "html/template"
    "log"
    "net/http"
    "os"
)

//構造一些資料
type IndexData struct {
    Title string `json:"title"`
    Desc  string `json:"desc"`
}

func index(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var indexData IndexData
    indexData.Title = "Liber-Blog"
    indexData.Desc = "this is the desc part"
    //把結構體例項轉成對應的json
    jsonStr, _ := json.Marshal(indexData)
    w.Write(jsonStr)
}

func indexHtml(w http.ResponseWriter, r *http.Request) {
    var indexData IndexData
    indexData.Title = "Liber-Blog"
    indexData.Desc = "this is the desc part"
    t := template.New("index.html")
    //想辦法把index.html解析了
    //想辦法拿到index.html的路徑,首先我們可以拿到當前的路徑
    path, _ := os.Getwd()
    t, _ = t.ParseFiles(path + "/template/index.html") //這裡就把html檔案解析了
    //想辦法把檔案執行了,這裡的第一個引數是上面的ResponseWriter,第二個引數是網頁顯示的資訊,是可選引數,不填也沒事
    t.Execute(w, indexData)
}

func main() {
    //    啟動一個http服務 指明ip和埠
    server := http.Server{
        Addr: "127.0.0.1:18080",
    }
    //響應訪問http://localhost:18080/的請求
    http.HandleFunc("/", index)
    //響應訪問http://localhost:18080/index.html的請求
    http.HandleFunc("/index.html", indexHtml)
    //    監聽對應的埠 & 啟動服務
    if err := server.ListenAndServe(); err != nil {
        log.Println(err)
    }
}

總結一下,這篇部落格中有兩點是以後相似專案也可以用到的:

  • 將結構體資料解析成json,返回json資料的方法
  • 解析html,返回html頁面的方法

參考: bilibili