Request
结构中的URL字段用于表示请求行中包含的URL(请求行也就是HTTP请求报文的第一行),这个字段是一个指向url.URL结构的指针,代码清单4-1展示了这个结构的定义。
代码清单4-1 URL结构
type URL struct {
Scheme string
Opaque string
User *Userinfo
Host string
Path string
RawQuery string
Fragment string
}
URL的一般格式为:
scheme://[userinfo@]host/path[?query][#fragment]
那些在scheme之后不带斜线的URL则会被解释为:
scheme:opaque[?query][#fragment]
在开发Web应用的时候,我们常常会让客户端通过URL的查询参数向服务器传递信息,而URL结构的RawQuery
字段记录的就是客户端向服务器传递的查询参数字符串。
举个例子,如果客户端向地址http://www.example.com/post?id=123&thread_id=456
发送一个请求,那么RawQuery
字段的值就会被设置为id=123&thread_id=456
。虽然通过对RawQuery
字段的值进行语法分析可以获取到键值对格式的查询参数,但直接使用Request
结构的Form
字段来获取这些键值对会更方便一些。本章稍后就会对Request
结构的Form
字段、PostForm
字段和MultipartForm
字段进行介绍。
另外需要注意的一点是,如果请求报文是由浏览器发送的,那么程序将无法通过URL结构的Fragment
字段获取URL的片段部分。本书在第1章中就提到过,浏览器在向服务器发送请求之前,会将URL中的片段部分剔除掉——因为服务器接收到的都是不包含片段部分的URL,所以程序自然也无法通过Fragment
字段去获取URL的片段部分了,造成这个问题的原因在于浏览器,与我们正在使用的net/http
库无关。
URL结构的Fragment字段之所以会存在,是因为并非所有请求都来自浏览器:除了浏览器发送的请求之外,服务器还可能会接收到HTTP客户端库、Angular这样的客户端框架或者某些其他工具发送的请求;此外别忘了,不仅服务器程序可以使用Request
结构,客户端库也同样可以把Request
结构用作自己的一部分。