(本節(jié)我們將創(chuàng)建一個(gè) Web 應(yīng)用和它的 Google App Engine 版本,在第 19 和 21 章分別說(shuō)明,當(dāng)你閱讀到這些章節(jié)時(shí)可以再回到這個(gè)例子。)
當(dāng)開(kāi)始一個(gè)新項(xiàng)目或增加新的功能到現(xiàn)有的項(xiàng)目,你可以通過(guò)在應(yīng)用程序中使用已經(jīng)存在的庫(kù)來(lái)節(jié)省開(kāi)發(fā)時(shí)間。為了做到這一點(diǎn),你必須理解庫(kù)的 API(應(yīng)用編程接口),那就是:庫(kù)中有哪些方法可以調(diào)用,如何調(diào)用。你可能沒(méi)有這個(gè)庫(kù)的源代碼,但作者肯定有記載的 API 以及詳細(xì)介紹了如何使用它。
作為一個(gè)例子,我們將使用谷歌的 API 的 urlshortener 編寫一個(gè)小程序:你可以嘗試一下在 http://goo.gl/ 輸入一個(gè)像 "http://www.destandaard.be" 這樣的URL,你會(huì)看到一個(gè)像 "http://goo.gl/O9SUO" 這樣更短的 URL 返回,也就是說(shuō),在 Twitter 之類的服務(wù)中這是非常容易嵌入的。谷歌 urlshortener 服務(wù)的文檔可以在 "http://code.google.com/apis/urlshortener/" 找到。(第 19 章,我們將開(kāi)發(fā)自己版本的 urlshortener)。
谷歌將這項(xiàng)技術(shù)提供給其他開(kāi)發(fā)者,作為 API 我們可以在我們自己的應(yīng)用程序中調(diào)用(釋放到指定的限制)。他們也生成了一個(gè) Go 語(yǔ)言客戶端庫(kù)使其變得更容易。
備注:谷歌讓通過(guò)使用 Google API Go 客戶端服務(wù)的開(kāi)發(fā)者生活變得更簡(jiǎn)單,Go 客戶端程序自動(dòng)生成于 Google 庫(kù)的 JSON 描述。更多詳情在 項(xiàng)目頁(yè)面 查看。
下載并安裝 Go 客戶端庫(kù):
將通過(guò) go install 實(shí)現(xiàn)。但是首先要驗(yàn)證環(huán)境變量中是否含有 GOPATH
變量,因?yàn)橥獠吭创a將被下載到 $GOPATH/src
目錄下并被安裝到 $GOPATH/PKG/"machine_arch"/
目錄下。
我們將通過(guò)在終端調(diào)用以下命令來(lái)安裝 API:
go install google.golang.org/api/urlshortener/v1
go install 將下載源碼,編譯并安裝包
使用 urlshortener 服務(wù)的 web 程序: 現(xiàn)在我們可以通過(guò)導(dǎo)入并賦予別名來(lái)使用已安裝的包:
import "google.golang.org/api/urlshortener/v1"
現(xiàn)在我們寫一個(gè) Web 應(yīng)用(參見(jiàn)第 15 章 4-8 節(jié))通過(guò)表單實(shí)現(xiàn)短地址和長(zhǎng)地址的相互轉(zhuǎn)換。我們將使用 template
包并寫三個(gè)處理函數(shù):root 函數(shù)通過(guò)執(zhí)行表單模板來(lái)展示表單。short 函數(shù)將長(zhǎng)地址轉(zhuǎn)換為短地址,long 函數(shù)逆向轉(zhuǎn)換。
要調(diào)用 urlshortener 接口必須先通過(guò) http 包中的默認(rèn)客戶端創(chuàng)建一個(gè)服務(wù)實(shí)例 urlshortenerSvc:
urlshortenerSvc, _ := urlshortener.New(http.DefaultClient)
我們通過(guò)調(diào)用服務(wù)中的 Url.Insert
中的 Do
方法傳入包含長(zhǎng)地址的 Url
數(shù)據(jù)結(jié)構(gòu)從而獲取短地址:
url, _ := urlshortenerSvc.Url.Insert(&urlshortener.Url{LongUrl: longUrl}).Do()
返回 url
的 Id
便是我們需要的短地址。
我們通過(guò)調(diào)用服務(wù)中的 Url.Get
中的 Do
方法傳入包含短地址的Url數(shù)據(jù)結(jié)構(gòu)從而獲取長(zhǎng)地址:
url, error := urlshortenerSvc.Url.Get(shwortUrl).Do()
返回的長(zhǎng)地址便是轉(zhuǎn)換前的原始地址。
示例 9.9 urlshortener.go
package main
import (
"fmt"
"net/http"
"text/template"
"google.golang.org/api/urlshortener/v1"
)
func main() {
http.HandleFunc("/", root)
http.HandleFunc("/short", short)
http.HandleFunc("/long", long)
http.ListenAndServe("localhost:8080", nil)
}
// the template used to show the forms and the results web page to the user
var rootHtmlTmpl = template.Must(template.New("rootHtml").Parse(`
<html><body>
<h1>URL SHORTENER</h1>
{{if .}}{{.}}<br /><br />{{end}}
<form action="/short" type="POST">
Shorten this: <input type="text" name="longUrl" />
<input type="submit" value="Give me the short URL" />
</form>
<br />
<form action="/long" type="POST">
Expand this: http://goo.gl/<input type="text" name="shortUrl" />
<input type="submit" value="Give me the long URL" />
</form>
</body></html>
`))
func root(w http.ResponseWriter, r *http.Request) {
rootHtmlTmpl.Execute(w, nil)
}
func short(w http.ResponseWriter, r *http.Request) {
longUrl := r.FormValue("longUrl")
urlshortenerSvc, _ := urlshortener.New(http.DefaultClient)
url, _ := urlshortenerSvc.Url.Insert(&urlshortener.Url{LongUrl:
longUrl,}).Do()
rootHtmlTmpl.Execute(w, fmt.Sprintf("Shortened version of %s is : %s",
longUrl, url.Id))
}
func long(w http.ResponseWriter, r *http.Request) {
shortUrl := "http://goo.gl/" + r.FormValue("shortUrl")
urlshortenerSvc, _ := urlshortener.New(http.DefaultClient)
url, err := urlshortenerSvc.Url.Get(shortUrl).Do()
if err != nil {
fmt.Println("error: %v", err)
return
}
rootHtmlTmpl.Execute(w, fmt.Sprintf("Longer version of %s is : %s",
shortUrl, url.LongUrl))
}
執(zhí)行這段代碼:
go run urlshortener.go
通過(guò)瀏覽 http://localhost:8080/
的頁(yè)面來(lái)測(cè)試。
為了代碼的簡(jiǎn)潔我們并沒(méi)有檢測(cè)返回的錯(cuò)誤狀態(tài),但是在真實(shí)的生產(chǎn)環(huán)境的應(yīng)用中一定要做檢測(cè)。
將應(yīng)用放入 Google App Engine,我們只需要在之前的代碼中作出如下改變:
package main -> package urlshort
func main() -> func init()
創(chuàng)建一個(gè)和包同名的目錄 urlshort
,并將以下兩個(gè)安裝目錄復(fù)制到這個(gè)目錄:
google.golang.org/api/urlshortener
google.golang.org/api/googleapi
此外還要配置下配置文件 app.yaml
,內(nèi)容如下:
application: urlshort
version: 0-1-test
runtime: go
api_version: 3
handlers:
- url: /.*
script: _go_app
現(xiàn)在你可以去到你的項(xiàng)目目錄并在終端運(yùn)行:dev_appserver.py urlshort
在瀏覽器打開(kāi)你的 Web應(yīng)用:http://localhost:8080。