0、链接上一篇文章:go语言学习之使用 Go 标准库构建 Web 应用程序
1、net/ http包提供了用于表示HTTP 消息的结构
Reqeust(是个struct),代表了客户端发送的HTTP请求消息
重要的字段:
URL
Header
Bady
Form、PostForm、MultipartForm
也可以通过 Request的方法访问请求中的Cookie、URL、User Agent等信息
Request 即可代表发送到服务器的请求,又可代表客户端发出的请求
2、请求的URL
Request的URL字段就代表了请求行(请求信息第一行)里面的部分内容
URL字段是指向url.URL类型的一个指针,url.URL是一个struct:
type URL struct {
Scheme string
Opaque string
User *Userinfo
Host string
Path string
RawQuery string
Fragment string
}
3、URL 的通用形式
通用格式是:scheme://[userinfo@]host/path[?query][ffragment]
不可以斜杠开头的URL被解释为:scheme:opaque[?query][#fragment]
4、URL Query
RawQuery会提供实际查询的字符串。
例如:http:// www.example.com/post?id=123tthread_id=456·它的 RawQuery的值就是id=123tthread_id=456
还有一个简便方法可以得到Key-Value对:通过 Request的 Form字段(以后再说)
5、 URL Fragment
如果从浏览器发出的请求,那么你无法提取出Fragment字段的值
浏览器在发送请求时会把fragment部分去掉
但不是所有的请求都是从浏览器发出的(例如从HTTP客户端包)
6、Request Header
请求和响应(Request、Response)的headers是通过 Header类型来描述的,它是一个map,用来表述HTTP Header里的Key-Value对。
Header map的 key是string类型,value是[string]
设置key的时候会创建一个空的[string 作为value,value里面第一个元素就是新header 的值;
为指定的key添加一个新的header值,执行append 操作即可
go相关的字段
r.Header
返回map
r.Header["Accept-Encoding"]
返回:[gzip, deflate]([]string 类型)
r.Header.Get("Accept-Encoding")
返回:gzip, deflate (string类型)
8、Request Body
请求和响应的 bodies都是使用 Body字段来表示的
Body是一个io.ReadCloser接口
一个 Reader接口
一个Closer 按口
Read接口定义了一个Open方法:
参数:[]byte
返回: byte 的数量、可选的错误
Closer接口定义了一个Close方法:
没有参数,返回可选的错误
想要读取请求body的内容,可以调用Body的 Read方法(例子)
package main
import (
"fmt"
"net/http"
)
func main() {
server := http.Server{
Addr: "localhost:8080",
}
http.HandleFunc(" /post", func(w http.ResponseWriter, r *http.Request) {
length := r.ContentLength
body := make([]byte, length)
r.Body.Read(body)
fmt.Fprintln(w, string(body))
})
server.ListenAndServe()
}