请求和响应的首部都使用Header类型描述,这种类型使用一个映射来表示HTTP首部中的多个键值对。

Header类型拥有4种基本方法,这些方法可以根据给定的键执行添加、删除、获取和设置值等操作。

一个Header类型的实例就是一个映射,这个映射的键为字符串,而键的值则是由任意多个字符串组成的切片。为Header类型设置首部以及添加首部都是非常简单的,但了解这两种操作之间的区别有助于更好地理解Header类型的构造:在对Header执行设置操作时,给定键的值首先会被设置成一个空白的字符串切片,然后该切片中的第一个元素会被设置成给定的首部值;而在对Header执行添加操作时,给定的首部值会被添加到字符串切片已有元素的后面,如图4-1所示。

图4-1 一个首部就是一个映射,这个映射的键为字符串,值为字符串切片

代码清单4-2展示了读取请求首部的方法。

代码清单4-2 读取请求首部

package main

import (
    "fmt"
    "net/http"
)

func headers(w http.ResponseWriter, r *http.Request) {
    h := r.Header
    fmt.Fprintln(w, h)
}

func main() {
    server := http.Server{
        Addr: "127.0.0.1:8080",
    }

    http.HandleFunc("/headers", headers)
    server.ListenAndServe()
}

这个代码清单中展示的服务器跟我们在第3章看到过的服务器基本上是一样的,唯一的区别在于这个服务器会把请求的首部打印出来。图4-2展示了在OS X系统的Safari浏览器上访问这个服务器的结果。

图4-2 在浏览器上展示的首部打印结果

如果想要获取的是某个特定的首部,而不是请求的所有首部,那么可以把服务器中的

h := r.Header

替换成

h := r.Header["Accept-Encoding"]

这样一来,程序就会得到"Accept-Encoding"键的首部值:

[gzip, deflate]

除此之外,我们还可以使用以下语句:

h := r.Header.Get("Accept-Encoding")

并得到以下结果:

gzip, deflate

注意以上两条语句之间的区别:直接引用Header将得到一个字符串切片,而在Header上调用Get方法将返回字符串形式的首部值,其中多个首部值将使用逗号分隔。

results matching ""

    No results matching ""