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
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!