menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 09.11.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    09.11.md
    5.95 KB / 2024-07-16 23:14:27
        # 9.11 在 Go 程序中使用外部库
    
    (本节我们将创建一个 Web 应用和它的 Google App Engine 版本,在第 19 和 21 章分别说明,当你阅读到这些章节时可以再回到这个例子。)
    
    当开始一个新项目或增加新的功能到现有的项目,你可以通过在应用程序中使用已经存在的库来节省开发时间。为了做到这一点,你必须理解库的 API(应用编程接口),那就是:库中有哪些方法可以调用,如何调用。你可能没有这个库的源代码,但作者肯定有记载的 API 以及详细介绍了如何使用它。
    
    作为一个例子,我们将使用谷歌的 API 的 urlshortener 编写一个小程序:你可以尝试一下在 http://goo.gl/ 输入一个像 "http://www.destandaard.be" 这样的 URL,你会看到一个像 "http://goo.gl/O9SUO" 这样更短的 URL 返回,也就是说,在 Twitter 之类的服务中这是非常容易嵌入的。谷歌 urlshortener 服务的文档可以在 "http://code.google.com/apis/urlshortener/" 找到。([第 19 章](19.0.md),我们将开发自己版本的 urlshortener)。
    
    谷歌将这项技术提供给其他开发者,我们可以在我们自己的应用程序中调用  API (释放到指定的限制)。他们也生成了一个 Go 语言客户端库使调用变得更容易。
    
    备注:谷歌让通过使用 Google API Go 客户端服务的开发者生活变得更简单,Go 客户端程序自动生成于 Google 库的 JSON 描述。更多详情在 [项目页面](http://code.google.com/p/google-api-go-client/) 查看。
    
    下载并安装 Go 客户端库:
    将通过 go install 实现。但是首先要验证环境变量中是否含有 `GOPATH` 变量,因为外部源码将被下载到 `$GOPATH/src` 目录下并被安装到 `$GOPATH/PKG/"machine_arch"/` 目录下。
    
    我们将通过在终端调用以下命令来安装 API:
    
    	go install google.golang.org/api/urlshortener/v1
    
    go install 将下载源码,编译并安装包
    
    使用 urlshortener 服务的 web 程序:
    现在我们可以通过导入并赋予别名来使用已安装的包:
    
    	import  "google.golang.org/api/urlshortener/v1"
    
    现在我们写一个 Web 应用(参见[第 15 章 4-8 节](15.4.md))通过表单实现短地址和长地址的相互转换。我们将使用 `template` 包并写三个处理函数:`root()` 函数通过执行表单模板来展示表单,`short()` 函数将长地址转换为短地址,`long()` 函数逆向转换。
    
    要调用 `urlshortener` 接口必须先通过 `http` 包中的默认客户端创建一个服务实例 `urlshortenerSvc`:  
    ```go
    urlshortenerSvc, _ := urlshortener.New(http.DefaultClient)
    ```
    
    我们通过调用服务中的 `Url.Insert` 中的 `Do` 方法传入包含长地址的 `Url` 数据结构从而获取短地址:
    
    ```go
    url, _ := urlshortenerSvc.Url.Insert(&urlshortener.Url{LongUrl: longUrl}).Do()
    ```
    
    返回 `url` 的 `Id` 便是我们需要的短地址。
    
    我们通过调用服务中的 `Url.Get` 中的 `Do` 方法传入包含短地址的 Url 数据结构从而获取长地址:
    
    ```go
    url, error := urlshortenerSvc.Url.Get(shwortUrl).Do()
    ```
    
    返回的长地址便是转换前的原始地址。
    
    示例 9.9	[urlshortener.go](examples/chapter_9/use_urlshortener.go)
    
    ```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))
    }
    ```
    
    执行这段代码:
    
    	go run urlshortener.go
    
    通过浏览 `http://localhost:8080/` 的页面来测试。
    
    为了代码的简洁我们并没有检测返回的错误状态,但是在真实的生产环境的应用中一定要做检测。
    
    将应用放入 Google App Engine,我们只需要在之前的代码中作出如下改变:
    
    	package main -> package urlshort
    	func main() -> func init()
    
    创建一个和包同名的目录 `urlshort`,并将以下两个安装目录复制到这个目录:
    
    	google.golang.org/api/urlshortener
    	google.golang.org/api/googleapi
    
    此外还要配置下配置文件 `app.yaml`,内容如下:
    
    ```yaml
    application: urlshort
    version: 0-1-test
    runtime: go
    api_version: 3
    handlers:
    - url: /.*
    script: _go_app
    ```
    
    现在你可以到你的项目目录并在终端运行:`dev_appserver.py urlshort`
    
    在浏览器打开你的 Web应用:http://localhost:8080。
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[Go 的外部包和项目](09.10.md)
    - 下一章:[结构 (struct) 与方法 (method)](10.0.md)
    
    
    
    links
    file_download