1. 程式人生 > >Go語言實現複雜Restful Api

Go語言實現複雜Restful Api

章節

  • 程式執行結果
  • 什麼是Restful Api?
  • go 實現複雜 Restful Api
  • 感想

0.程式執行結果

2836699-b6fbdefa9a340ae8.png

程式執行結果

1.什麼是Restful Api

2. go 實現複雜 Restful Api

2.1 go http server 端程式碼 httpServer.go 實現

package restApi

import (
    "fmt"
    "github.com/gorilla/mux"
    "html"
    "net/http"
)

func fooHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "hello,%q", html.EscapeString(r.URL.Path))
}

func doGetApiParam(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    toDoId := vars["toDoId"]
    fmt.Fprintf(w, "toDoId is: "+toDoId)
}

//開啟http伺服器
func FooHandler() {
    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/foo", fooHandler)
    router.HandleFunc("/hello", fooHandler)
    router.HandleFunc("/todo/{toDoId}", doGetApiParam)
    //返回 api json 資料
    router.HandleFunc("/users", restApiHandler)
    //返回 productsList 資料
    router.HandleFunc("/productsList", productsList)
    //開啟http服務,並引入路由管理器
    http.ListenAndServe(":8082", router)
}

2.2 複雜 Api handler 端程式碼 complexApi.go 實現

package restApi

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

/**
   1.需求
     編寫返回商品列表資料的Api,返回資料對應的 struct (go 中struct為值型別)如下所示
 */

//定義介面返回的核心資料 如商品詳情資訊
type ProductInfo struct {
    Name         string `json:"name"`         //商品名稱
    Des          string `json:"des"`          //商品資訊描述
    UseMethod    string `json:"useMethod"`    //使用方法
    UseRange     string `json:"useRange"`     //使用範圍
    ValidDate    string `json:"validDate"`    //有效期
    RpbStatement string `json:"rpbStatement"` //權責宣告
}

type Data struct {
    ProductsInfo []ProductInfo `json:"productsInfo"`
}

//定義介面返回的data資料
type ApiData struct {
    //[結構體變數名 | 變數型別 | json 資料 對應欄位名]
    ErrCode int    `json:"errCode"` //介面響應狀態碼
    Msg     string `json:"msg"`     //介面響應資訊
    Data    Data   `json:"data"`
}

//請求路由(對映)至 productsList() handler
func productsList(w http.ResponseWriter, r *http.Request) {
    //1.介面狀態碼
    errorCode := 0
    //2.介面返回資訊
    msg := "get products list success!"

    product1 := ProductInfo{
        "柿餅",
        "來自陝西富平的特產",
        "開箱即食",
        "全國",
        "2018-10-20 至 2018-12-31",
        "與xx公司無關",
    }

    product2 := ProductInfo{
        "金槍魚",
        "來自深海的美味",
        "紅燒、清蒸均可",
        "全國",
        "2018-10-20 至 2018-12-31",
        "與xx公司無關",
    }

    product3 := ProductInfo{
        "鯰魚",
        "來自淡水的美味",
        "紅燒、清蒸均可",
        "全國",
        "2018-10-20 至 2018-12-31",
        "與xx公司無關",
    }

    //3.省略對應 DB(關係、非關係、搜尋引擎) 操作,以 hard code 代替
    data := Data{[]ProductInfo{product1, product2, product3}}
    //4.組裝介面返回的資料
    apiData := ApiData{errorCode, msg, data}
    //5.介面響應複雜json資料
    json.NewEncoder(w).Encode(apiData)
}

感想

簡單的東西需要記錄,刻意練習才能保持精進!