本人从事Go语言开发多年,目前主要从事云计算相关开发。
写本公众号的目的主要是对自己的过往知识进行梳理,也希望可以帮助大家学习~
后续会推出Go语言源码学习系列和web开发系列等,欢迎大家关注。
思维逻辑图如下:
下面我们将以如上所示的两个方面展开介绍
Client主要包括四个成员:
1. Transport:用来指定执行一次独立的HTTP请求的机制,如果为nil,则使用默认的 DefaultTransport
2. CheckRedirect:用来指定处理重定向的策略
3. Jar:Cookie管理
4. Timeout:指定该客户端发起的请求的执行时间限制
下面我们再来看一下请求的定义:
Request包括的内容较多,我们部分做一些简单介绍:
1. Method:请求方法
补充:示例中我们使用了GET请求方法:实现从服务端获取资源;
除此之外还有POST,HEAD,OPTIONS,PUT,DELETE,TRACE,CONNECT请求方法:
POST : 向服务器提交或新建一个资源
HEAD:获取响应消息报文头
OPTIONS:查询服务端的功能性信息
PUT:向服务端存储资源
DELETE:在服务端删除资源
TRACE:从服务端回显请求信息
CONNECT:HTTP/1.1协议中预留给能够将连接转为通道方式的代理服务器
2. URL:请求地址
补充:URL全称为统一资源定位符,是互联网上资源位置的一种表示。互联网中的每个文件都有唯一的URL,示例中的http://www.baidu.com即为一种URL
3. Proto,ProtoMajor,ProtoMinor:分别为协议版本,主版本,副版本
4. Header:请求头部
5. Body:请求的Body体
6. GetBody:一个可选的实现对Body体进行复制返回的函数
7. ContentLength:从Body体读取的字节长度
8. Form:解析好的表单数据
9. MultipartForm:解析好的多部分表单数据
10. RemoteAddr:允许HTTP服务器或者其他软件记录本次请求的来源地址,通常为了日志使用
以上是我们关于客户端和请求的相关介绍,接下来在示例中我们通过调用新建客户端的Do方法实现请求的发送,最后对返回的数据进行显示处理。
客户端除了Do方法,还包括如下四个方法:
这四个方法都是对Do方法的封装,内部均调用Do方法来实现具体的功能。在此,我们便不再做一一介绍,有兴趣的同学可以通过源码进行阅读和实践
通过上面的学习,大家基本上已经掌握了如何通过客户端发起一次请求,但是有的同学可能会觉得稍显麻烦,毕竟先得创建客户端,然后设置请求,再发送,有没有更简单的方式呢?有
我们看一下http包里的Get方法:
其实Get方法是客户端Get方法的封装,如下所示,而上文我们说过客户端的Get方法也是Do方法的封装,所以就是对上面较为繁琐方式的一种封装,方便的同时失去了用户自定义客户端和请求内容的灵活性
以上是关于客户端编程的介绍
通过如上实现,我们便创建了一个监听本机地址,端口为8888的服务端。首先通过创建路由转接器,然后将指定路径的处理器注册到路由器里,之后将路由器注入Server并监听8888端口,最后启动服务,在浏览器输入:http://localhost:8888,结果如下:
下面我们分析一下上面的具体过程:
首先看一下服务端Server的定义:
我们对Server的成员做部分介绍:
1. Addr:监听的TCP地址
2. Handler:调用的处理器
3. ReadTimeout:读取请求的最长持续时间
4. ReadHeaderTimeout:用于读取请求头的时间
5. WriteTimeout:回复的写入操作的最长持续时间
6. MaxHeaderBytes:请求头部的最大长度
接下来,我们继续看一下路由器的定义:
如上图所示,在路由器里包括了一个读写锁,因为我们需要对其中存储处理器的map进行操作,其中结构体muxEntry定义了路径和处理器。示例中HandleFunc便是将处理器注册到路由器里的操作
同样的,和客户端编程一样,大家可能觉得这样的方式会略显麻烦,那有没有同样简便的操作方式呢?有
如上所示,通过调用http包里的HandleFunc函数进行处理器注册,具体是怎么实现的呢?
由上图可知,HandleFunc函数里封装了一个默认的路由器DefaultServeMux,然后调用该处理器的处理器注册方法HandleFunc将处理器注册
接下来,进一步调用http包里的ListenAndServe函数,那么ListenAndServe如何定义的呢?
我们可以看到,ListenAndServe函数里封装了服务端的创建过程,然后和我们第一种的实现方式一样,调用服务器的ListenAndServe方法,由于我们这里使用的是http包里默认的DefaultServeMux路由器,所以示例中http.ListenAndServe的第二个参数为nil
以上是关于服务端编程的内容
综上,我们通过本篇的内容对客户端和服务端编程进行了介绍。客户端以GET方法为例,服务端以http协议为例,除此之外还有其他的客户端请求方法以及另外的服务端https协议,大家可以在本篇的基础上进一步的实践和理解
到此关于Golang网络编程之HTTP编程相关内容的分享就结束了~
此篇为Go语言基础系列分享第十四篇,欢迎大家关注本公众号《Go开发与计算机技术》,Go语言基础系列学习不迷路。