3.2. 一个简单的 Go Web 程序 之 『fmt包和net/http包的简单使用』
【课程地址】#
部分示例程序
// Functions that handle user requests
func handlerFunc(w http.ResponseWriter, r *http.Request) {
// 设置响应头
w.Header().Set("X-APP-NAME", "GoBlog")
w.Header().Set("X-APP-CREATOR", "Tacks")
// 设置响应状态码
w.WriteHeader(http.StatusOK)
// 设置响应主体body
fmt.Fprintf(w, "<h1>Hi! This my GoBlog, I am Tacks! </h1>")
fmt.Fprintf(w, "<h2>User Request</h2>")
// 获取用户请求的host并且返回
fmt.Fprintf(w, "[Host]: " + r.Host + "<br>")
// 获取用户的浏览器标志并且返回
fmt.Fprintf(w, "[User-Agent]: " + r.Header.Get("User-Agent") + "<br>")
// 采用Write输出内容
w.Write([]byte("=> to be continue ... "))
}
1. 【fmt 包】#
用来格式化 IO 的函数,类似 C 语言的 printf 输出和 scanf 输入。
- 1、Println (a …interface {}) (n int, err error) 将变量格式化写入标注输出,并且再后面自动追加换行
- 2、Fprintf (w io.Writer, format string, a …interface {}) (n int, err error) 格式化内容写入到 w 文件中,并且返回字节数
- 3、满足 io.Writer 的接口类型的都支持写入,因此,http.ResponseWriter 也可以理解成文件,将内容写入到 http 的响应内容中
2.【net/http 包】#
http 提供了 HTTP 客户端和服务器实现, 例如 HTTP 服务器可以用来处理 Web 请求等。
- 1、 ListenAndServe (addr string, handler Handler) error 监听一个地址提供 HTTP 服务;可以设置 80、443 或者 3000 等其他端口
- 2、 HandleFunc(pattern string, handler func(ResponseWriter, *Request))
- 用来处理指定路由模式的 HTTP 请求,通过传入一个 自定义的 Handler 方法便可以自己处理请求的响应
- 3、 自定义的 Handler 方法通过两个入参 http.Request 和 http.ResponseWriter 拿到请求信息和设置响应信息
- 4、 http.ResponseWriter 该接口用来构造 HTTP 响应,然后返回给用户 ,处理之后不能使用 ResponseWriter - w.Header ().Set (key, value) 可以用来设置 http 响应头
- w.WriteHeader (http.StatusOK) 可以用来设置 http 状态码,一般成功会自动返回,不用显示设置
- w.Write () 可以用来设置 http 响应的 body 主体,当然你也可以采用 fmt.Fprintf (w,””) 这种方式将内容写入响应主体中
- 5、 http.Request 获取用户的请求信息
- r.URL.Query () 用来获取用户请求的参数
- r.Header.Get (“User-Agent”) 获取请求头的一些字段
3.【注意】#
- http.ResponseWriter 注意设置响应头、设置响应状态码,输出响应内容的顺序
- 顺序应该为 w.Header ().Set () 、 w.WriteHeader () 、 w.Write ()
- 可以尝试查看 server.go 的源码,追查 “type response struct”
- 查看 wroteHeader 字段, 是一个 bool 类型, 标志着是否已经写入 header 头
- 搜索 “func (w *response) WriteHeader (code int)” 查看函数定义
- 如果已经设置过响应状态码,根据 wroteHeader 的标记,我们就知道不能重复设置状态码 否则会报错 superfluous response.WriteHeader call
- 并且 WriteHeader () 会规范化响应的 header 头,key 的首字母大写,字符 - 后的单词的首字母也大写;
go 很容易就可以实现一个 web 服务器,还挺好用的,不用起其他 nginx 服务啥的;
推荐文章: