http包发送模块详解-golang

功能简介

完成http的发送和对http服务器响应数据的处理

主要结构体简介

1.Request,Response结构体,封装http内容以及解析http协议

2.RoundTripper接口,能够执行HTTP发送,并能返回给定请求的response。该功能可由开发者实现

3.TransPort结构体,http库内部实现的RoundTripper接口,使用request,reponse,persistConn结构体方法,与远程服务器完成数据交互,完成http请求.(涉及到persistConn连接池)

4.persistConn结构体,tcp连接,发送与接收http协议内容数据,完成与http服务器端的数据交互

http发送代码示例

我先简单贴一下http发送的使用方法:

设置request请求

req, err := http.NewRequest("PUT", "http://www.baidu.com", nil)
if err != nil {
   fmt.Print("设置Request结构体出错:" + err.Error())
   return
}
req.Header.Add("Authorization", "xxxxxxx") //设置header头

发送request:

client := http.Client{
   Timeout:   3 * time.Second,       //设置超时时间
   Transport: http.DefaultTransport, //设置传输工具,可以使用默认工具
} //设置超时时间
resp, err := client.Do(req) //执行http发送,得到Response结构体
if err != nil {
   fmt.Println("数据发送出错:", err.Error())
   return
}
fmt.Println(resp.Status) //打印部分结果

http库发送模块

http发送模块图如下:

上面http发送流程图,只有一个简要的大体流程,有很多细节没有描述处理,将次要细节隐藏了,只保留了主要流程.下面根据发送流程,简要的解释一下各流程的作用.

发送流程简介

根据http发送模块图,简要的介绍一下各个过程的作用

①调用client.Do(req),启动http发送功能,使用Transport结构体中RoundTrip()方法完成发送功能

② 获取persistConn连接(复用的连接或者新生成连接),该连接为TCP连接,可以发送和接收http协议数据,于服务器端完成交互.

③启动两个协程readLoop协程和writeLoop协程(暂且以此命名,便于描述),启动协程如下:

go pconn.readLoop() //等待从http服务器端读取数据
go pconn.writeLoop() //等待向http服务器发送http协议数据

数据的传递由channel实现,连接的roundTrip()方法,向writeLoop()协程发送数据,启动writeLoop向http服务器发送数据功能

writeLoop协程发送完成以后,通过channel向readLoop协程发送数据,激活向服务器读取http协议数据功能

readLoop协程数据读取完成,通过channel将数据返回给等待数据的roundTrip方法

persistConn连接的复用,其中指的就是writeLoop协程和readLoop()协程循环发送和接收数据,每个下图流程就是一次http请求发送和接收

数据流动如下,使用channel发送数据:

④通过channel,将request结构体数据传入到writeLoop协程,writeLoop协程使用request的http协议封装方法,获取http数据,将数据传入到http服务器

⑤调用Request结构体的write方法,封装http协议,将数据发送到http服务器,其中数据发送设置的缓冲区大小为32k

⑥数据发送完成,通知readLoop协程读取http服务器响应数据

⑦调用response文件中的ReadResponse()函数,传入服务器响应io,解析http响应数据,设置Response结构体

⑧将设置完成的Response结构体返回

⑨通过channel,将生成的Response结构体从readLoop协程传送到http主协程(roundTrip方法中)

⑩将response结构体返回到client中,http发送完成.

你可能感兴趣的:(goalng,HTTP,http,golang,发送流程,编程,代码)