再來要寫一個簡單的小應用了,在這邊會用兩個 package 來介紹,一個是 golang standard lib,一個是我個人很常用的 gorilla 這個團隊推出的 mux 套件,先來介紹 standard 版的

net/http

這是一個 golang 標準內建的 http package,這要如何正確使用呢?

package main

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

func main() {
	http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello World")
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

此範例,無法直接在 playground 執行,故不提供執行連結

由上面看到,這個範例簡單,就能透過瀏覽器,在這個範例所在的 ip ex http://{ip}/ping ,就能看到一個 pong 字串。

那如果要輸出 json 呢? 其實也很簡單如下

package main

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

type UserInfo struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {

	http.HandleFunc("/api/query", func(w http.ResponseWriter, r *http.Request) {
		u := &UserInfo{
			Name: "syhlion",
			Age:  18,
		}
		b, err := json.Marshal(u)
		if err != nil {
			log.Println(err)
			return
		}
		w.Header().Set("Content-Type", "application/json;charset=UTF-8")
		w.WriteHeader(http.StatusOK)
		w.Write(b)
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

由上面可以看到,只要存取 http://{ip}/api/query ,就能得到下面的 json 的 response

{
    name:"syhlion",
    age:18
}

github.com/gorilla/mux

再來介紹的是我個人很喜歡用的第三方套件 mux ,我喜歡的原因是他提供的 api ,可以跟原生的參數完全相容,沒有太多多餘的包裝,但又有很多方便寫 router 的方法

package main

import (
	"fmt"
	"github.com/gorilla/mux"
)

func main() {
	r := mux.NewRouter()
	r.HandleFunc("/api/query/{name}", func(w http.ResponseWriter, r *http.Request) {
		vars = mux.Vars(r)


		//這邊就把 name 帶入 UserInfo
		u := &UserInfo{
			Name: vars["name"],
			Age:  18,
		}
		b, err := json.Marshal(u)
		if err != nil {
			log.Println(err)
			return
		}
		w.Header().Set("Content-Type", "application/json;charset=UTF-8")
		w.WriteHeader(http.StatusOK)
		w.Write(b)

	})

    //聽8000 port
    log.Fatal(http.ListenAndServe(":8000", r))
}

由上面可以看到 mux.Vars ,可以自動幫你 parse router 裡面設定的 {name},它有支援簡易的正則判斷,詳細可以參閱官網