Golang 第一章 5.获取URL网页内容

  • By v2ray节点

  • 2024-06-26 10:13:07

  • 评论

对于许多应用程序而言,从互联网获取信息的重要性不亚于访问本地文件系统。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 中。


v2ray节点购买