- 可以在環境中設定代理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)
}
}
效果:
沒有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"))
}
效果:
我們可以構造完整一些的例子如下:
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)
}
}
執行結果如下:
新增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