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结构用作自己的一部分。

results matching ""

    No results matching ""