您的位置:首页 > 产品设计 > UI/UE

Go web之旅(Request分析)

2015-08-24 20:20 531 查看
在网站上进行的每一次交互,其实其内部所经历的过程可以简化为3步:

1.发送请求

2.服务器端进行处理

3.请求响应

为什么要提到上面的交互过程呢?因为最近有读者建议讲一下网站交互,所以现在我们结合网站交互过程进行我们今天的Go web旅程之源码解析。

我们都知道网站是采用http协议进行数据传送的。http请求是由三部分组成,分别是:请求行、请求头、请求主体。下面是访问google时的请求和响应:



咱先分析请求,最上面四行是请求行,其格式一般为(方法+[空格]+请求URI+[空格]+版本号+[回车换行]),最下面的是请求头,一般内容如上图,还有请求主体这里没有,因为一般请求方式为GET的请求,是没有请求主体的,因为该请求方式的请求其数据一般封装在地址栏的。

好了介绍了这么长时间的的http协议的请求格式,下面我们就看一下go语言的request的数据结构和常用的函数:

type Request struct {

Method string//请求方式(GET, POST, PUT, etc.),一般没写的话默认为GET

URL *url.URL//请求地址
Proto      string //协议版本 "HTTP/1.0"
Header Header   //请求头

Body io.ReadCloser//请求主体

ContentLength int64//请求主体内容的长度

Host string      //主机
......

}
其中Header的类型为map[string][]string,采用键值对的形式来存储request请求头,这从上面图中就可以看出。
type Header map[string][]string


常见的函数:

//ParseHTTPVersion解析HTTP版本.

// eg.”HTTP/1.0” 返回值(1, 0, true).

func ParseHTTPVersion(vers string) (major, minor int, ok bool)
// NewRequest创建一个给定method, URL,body的Request
func NewRequest(method, urlStr string, body io.Reader) (*Request, error)
//BasicAuth函数是用来获取请求头的授权,它是调用parseBasicAuth()函数进行解析实现的

func (r *Request) BasicAuth() (username, password string, ok bool)
func parseBasicAuth(auth string) (username, password string, ok bool)
//解析请求行
func parseRequestLine(line string) (method, requestURI, proto string, ok bool)
//ReadRequest函数从输入流中读取并解析得到一个Request
func ReadRequest(b *bufio.Reader) (req *Request, err error)


在网站的交互中最重要的是数据的交流了,数据在不同的层次或不同的地方类型是不同的,

而且采用不同的方式发送请求,其数据类型也是不同的。

比如在前端数据一般用字符串作为类型,在后台会采用各种不同的类型

在数据传google会采用json格式,而在后台会采用结构体或对象来交流数据。

请求方式方面,如果采用GET方式,数据是直接拼接在URL中,而采用POST,PUT方式数据一般使用form(表单)

进行数据封装的。

下面两个函数就是go语言中实现对request中的form封装的数据进行解析的
/*对request中的form封装的数据进行解析,
内部实现机制:根据请求方式的不同采用不同的方式解析.
如果请求方式为POST,PUT,或PATCH则调用parsePostForm()进行解析
*/
func (r *Request) ParseForm() error
func parsePostForm(r *Request) (vs url.Values, err error)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: