功能简介
完成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请求
|
发送request:
|
http库发送模块
http发送模块图如下:
上面http发送流程图,只有一个简要的大体流程,有很多细节没有描述处理,将次要细节隐藏了,只保留了主要流程.下面根据发送流程,简要的解释一下各流程的作用.
发送流程简介
根据http发送模块图,简要的介绍一下各个过程的作用
①调用client.Do(req),启动http发送功能,使用Transport结构体中RoundTrip()方法完成发送功能
② 获取persistConn连接(复用的连接或者新生成连接),该连接为TCP连接,可以发送和接收http协议数据,于服务器端完成交互.
③启动两个协程readLoop协程和writeLoop协程(暂且以此命名,便于描述),启动协程如下:
|
数据的传递由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发送完成.