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 服务啥的;

明天我们吃什么 悲哀藏在现实中 Tacks