iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
1
Software Development

啥物碗Golang? 30天就Go系列 第 11

API Server 範例

  • 分享至 

  • xImage
  •  

透過例子我們可以越來越接近go在真實使用情境的樣貌。昨天我們聊到微服務透過API彼此溝通,今天我們來試試看實作簡易的API Server,首先我們在第八天知道可以透過網址得到參數的方法:

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", handler)
    http.ListenAndServe("localhost:3000", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

透過r.URL.Path我們可以得到根目錄下的字串,去掉斜線後就是我們要的值。比方說訪問網址http://localhost:3000/123我們會得到:

URL.Path = "/123"

也就是說r.URL.Path等於"/123",能取到值,剩下的就只是轉換的問題了。

布林值

首先來看看以布林值作為參數的類型(為了簡化只貼上相關的程式,完整版請見github):

func main() {
	http.HandleFunc("/bool/", isHappy)
	if err := http.ListenAndServe(":3000", nil); err != nil {
		panic(err)
	}
}

func isHappy(w http.ResponseWriter, r *http.Request) {
	a := strings.Split(r.URL.Path, "=")
	_, b := a[0], a[1] == "true"
	if b {
		fmt.Fprint(w, "I am a Happy man")
	} else {
		fmt.Fprint(w, "I am not a Happy man")
	}
}

程式可能有點醜,但一開始學習先求會動,會動以後我們再持續精進,讓code越來越美麗。接下來我們訪問瀏覽器:

// 我懶得截圖,以下是網址與頁面得到的結果的對應
http://localhost:3000/bool/isHappy=true
> "I am a Happy man"
http://localhost:3000/bool/isHappy=false
> "I am not a Happy man"

都可以得到預期的結果,很好。

數字

數字是API中最常見的型態,今天的範例暫時不連動到model與資料庫,我們來試著處理簡單的數學運算:

func main() {
	http.HandleFunc("/num/", add)
	if err := http.ListenAndServe(":3000", nil); err != nil {
		panic(err)
	}
}

func add(w http.ResponseWriter, r *http.Request) {
	a := strings.Split(r.URL.Path, "/")
	_, _, s := a[0], a[1], a[2]
	i, err := strconv.Atoi(s)
	if err != nil {
		panic(err)
	} else {
		fmt.Fprintf(w, "n + 100 = %d\n", i+100)
	}
}

恩,一樣寫得很醜,但是功能合乎預期,我們來看看網頁結果:

http://localhost:3000/num/1000
> n + 100 = 1100
http://localhost:3000/num/123
> n + 100 = 223

掌握了這兩種基本型態,剩下的也就只是型態轉換與資料庫互動的問題。我相信go應該會有處理網址參數更聰明的方法,現在先讓我們土法煉鋼一下吧!

Reference

今天比較特別,沒有參考網站,自己出題自己解開!硬要說的話,參考了第八天Web Server


上一篇
靜態檔案分享伺服器 File System Server
下一篇
進階取得路徑中參數的方法
系列文
啥物碗Golang? 30天就Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

看到Reference只需要引用自己的文章就好~值得拍拍手! /images/emoticon/emoticon47.gif

Bater iT邦新手 4 級 ‧ 2018-10-17 17:09:33 檢舉

/images/emoticon/emoticon01.gif

我要留言

立即登入留言