Golang 第一章 5.获取URL网页内容
对于许多应用程序而言,从互联网获取信息的重要性不亚于访问本地文件系统。Go语言提供了一组包,归类在 net 下,使得通过互联网发送和接收信息、进行低级网络连接以及设置服务器变得简单。对于设置服务器而言,Go语言的并发特性(在第8章介绍)尤其有用。
为了说明通过HTTP检索信息的最低必要操作,这里有一个简单的程序叫做 fetch,它获取每个指定URL的内容,并将其作为未解释的文本打印出来;它受到了非常有用的 curl 实用工具的启发。显然,通常情况下,我们会对这样的数据做更多处理,但这展示了基本的概念。我们将在博客中经常使用这个程序。
gopl.io/ch1/fetch
// 打印在 URL 上找到的内容。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
for _, url := range os.Args[1:] {
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
os.Exit(1)
}
b, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
os.Exit(1)
}
fmt.Printf("%s", b)
}
}
这个程序引入了来自两个包,net/http 和 io/ioutil,的函数。http.Get 函数发起一个 HTTP 请求,并且如果没有错误,将结果返回到响应结构体 resp 中。resp 的 Body 字段包含服务器响应的可读流。接着,ioutil.ReadAll 函数读取整个响应体;结果存储在变量 b 中。为了避免资源泄漏,关闭了 Body 流,然后 Printf 将响应写入标准输出。
$ go build gopl.io/ch1/fetch
$ ./fetch http://gopl.io
<html>
<head>
<title>The Go Programming Language</title>
...
如果 HTTP 请求失败,fetch 将输出失败:
$ ./fetch http://bad.gopl.io
fetch: Get http://bad.gopl.io: dial tcp: lookup bad.gopl.io: no such host
无论是哪种错误情况,os.Exit(1) 都会导致进程以状态码 1 退出。
练习 1.7:
使用 io.Copy(dst, src) 函数而不是 ioutil.ReadAll,将响应体复制到 os.Stdout,而不需要一个足够大的缓冲区来存储整个流。确保检查 io.Copy 的错误结果。
练习 1.8:
修改 fetch 程序,在每个 URL 参数缺少 http:// 前缀时添加它。可以使用 strings.HasPrefix 函数。
练习 1.9:
修改 fetch 程序,同时打印响应的 HTTP 状态码,该状态码存储在 resp.Status 中。
评论