Go web之旅(Request分析)
2015-08-24 20:20
531 查看
在网站上进行的每一次交互,其实其内部所经历的过程可以简化为3步:
1.发送请求
2.服务器端进行处理
3.请求响应
为什么要提到上面的交互过程呢?因为最近有读者建议讲一下网站交互,所以现在我们结合网站交互过程进行我们今天的Go web旅程之源码解析。
我们都知道网站是采用http协议进行数据传送的。http请求是由三部分组成,分别是:请求行、请求头、请求主体。下面是访问google时的请求和响应:
咱先分析请求,最上面四行是请求行,其格式一般为(方法+[空格]+请求URI+[空格]+版本号+[回车换行]),最下面的是请求头,一般内容如上图,还有请求主体这里没有,因为一般请求方式为GET的请求,是没有请求主体的,因为该请求方式的请求其数据一般封装在地址栏的。
好了介绍了这么长时间的的http协议的请求格式,下面我们就看一下go语言的request的数据结构和常用的函数:
常见的函数:
//ParseHTTPVersion解析HTTP版本.
// eg.”HTTP/1.0” 返回值(1, 0, true).
在网站的交互中最重要的是数据的交流了,数据在不同的层次或不同的地方类型是不同的,
而且采用不同的方式发送请求,其数据类型也是不同的。
比如在前端数据一般用字符串作为类型,在后台会采用各种不同的类型
在数据传google会采用json格式,而在后台会采用结构体或对象来交流数据。
请求方式方面,如果采用GET方式,数据是直接拼接在URL中,而采用POST,PUT方式数据一般使用form(表单)
进行数据封装的。
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)
相关文章推荐
- UIKeyboard
- Android UI设计——RadioButton和CheckBox控件
- STL Algorithms 之 unique
- Android UI之QuickContactBasge
- UItableView中的一些方法
- IOS-笔记14(UITextField,UITableView)
- HDU 5400(Arithmetic Sequence-暴力找区间)
- UIScrollView添加控件,控件距离顶部始终有间距的问题
- 5 Techniques To Understand Machine Learning Algorithms Without the Background in Mathematics
- IOS第12天(3,UIViewController的生命周期)
- IOS UITextView自适应高度
- IOS UITextView自适应高度
- IOS第12天(2,UINavigationController导航控制器)
- uuid生成12位随机数 不重复
- UIAlert的使用
- STL学习----入门(1)[queue]
- 野人学Android基础篇之初探UI控件第一课--TextView静态赋值
- The Dole Queue(UVA 133)
- IOS第12天(1,UIViewController控制器的创建的 三种方式,和第一个view创建)
- 百度编辑器ueditor简单易用