关闭

Go web之旅(Request分析)

标签: 源码http协议go语言go语言源码分析
755人阅读 评论(0) 收藏 举报
分类:

在网站上进行的每一次交互,其实其内部所经历的过程可以简化为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)
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25196次
    • 积分:721
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论