Go 實作 Restful API

Chung-chun Lo
Skyler Record
Published in
5 min readMar 17, 2019

Hi 大家好自從上次介紹完 Go 後就有一些朋友再問能不能寫個範例,所以今天我們就來用 Go 做個簡單的 API 吧。
廢話不多說讓我們直接開始!!!

首先當然是要先把 Go 安裝起來,不過這步驟我想大家都沒什麼問題所以我就把連結放在這讓大家自己下載相對應的版本安裝起來即可。

這裡記得要注意你安裝的路徑(GOROOT)windows 預設應該會是在 C 槽,而工作路徑(GOPATH)預設會是在使用者目錄下。這很重要因為會跟之後要包成 Docker 或是套件的 Import 有關。

開發工具的部份當然是 Visual Studio Code

基本上我們會把專案資料夾放在 GOPATH 裡面的 src 裡面,使用 go get 抓下來的套件也會在這。

為了讓大家等一下可以比較容易理解這裡先講一些Go的基本用法

函數宣告

如範例所示,Go在宣告function時是使用 func 而 AddTodo 這個 function 傳入兩個參數分別是類別為 int64 的 id 和 string 的 item 最後則是回傳一個 bool 。

變數宣告

這裡要特別注意的是在 Go 裡宣告函數、變數、struct … 等等的時候並沒有 public 和 private 這樣的字眼,取而代之的則是開頭的大小寫

所以當你在使用struct的時候所有的欄位開頭都必須是大寫,但是這樣如果我有些驗證或是回傳的 Json 一定要是小寫的欄位名稱該怎麼辦呢 ?
這時候可以利用Tag來解決這樣的問題。

然後說一下每個 package 都會是從 init() 這個 function 開始的,如果是 main.go 的話執行順序就會是 init() -> main() -> main 中所呼叫的 function

基本的概念當然不只這些,其他東西我相信網路上應該很多,只不過這些是我當時比較困惑的地方所以列出來跟大家說一下。
Ok 再來我們就正式開始吧

專案路徑:$GOPATH/src/api

專案結構

基本上這是我自己建立專案時的架構,這種東西沒有絕對不過可以參考看看

main.go : Go 專案的起始點
router : 負責API的Router
controller :就如同它的名子一樣負責流程的控制
services :跟資料庫要資料、介接其他API等服務

Router

router 的部份我使用的是 gorilla/mux 這個第三方套件,Go 雖然本身也有自帶套件,不過方便性並沒有像 gorilla/mux 來的好。

在這裡我們要先使用 go get 來安裝套件

go get -u github.com/gorilla/mux

這裡我們建立了兩個 API 主要是新增 Todo 跟查尋 Todo,然後這裡可以注意到我 import controller 的路徑是 api/controller 。

其實 Go 的 import 也是可以用相對路徑的,但是這樣在之後需要包成 Docker Image 的時候會有一些問題,所以比較常見的作法就是將專案放置在 GOPATH 裡的 src 底下,然後路徑會是 : "專案名稱/package位置"

Controller

這裡基本上就是將 Request 的資訊讀出來做相對應的處理,使用 Go 本身的套件將 Res.Body 轉成 Json ,在這裡我使用了 io.LimitReader 來限制 Res.Body 的大小不能超過 1 KB。

Service

這裡的 service 因為沒有接資料庫的關係,所以我就只讓它負責做 Response 而已

main

再來就是我們的 main.go 拉,由於 Go 和 NodeJs 一樣本身自帶 Http 套件,所以不用額外安裝 package 就可以提供 http 服務,如範例

最後我們可以看到我新增了兩個 Todo 並且獲得正確的 Response。

最後我們透過另一隻 API 查尋 Id 為 1 的 Todo

結論

其實 Go 開發 API 是件簡單且快速的事情,而且網路上範例也相當多。
今天主要是提供一個簡單的範例順便提一下之前我踩到的雷,例如 : Package 的 import 路徑、變數大小寫這些等等,希望之後可以幫助大家避免犯一樣的錯誤。
最後如果大家想多了解一些文章沒提到的東西,或是文章有錯誤的地方都歡迎來找我,我們可以互相交流討論一下那我們就下次再見拉~

--

--