上一篇文章我们介绍了Go语言的map数据类型,并且通过该类型实现了对请求内容类型的处理。接下来这篇文章我们仍然使用该类型的变量,这次我们实现对请求类型的处理。所谓请求类型是指http中的PUT、GET和POST等请求类型。
我们之前实现的Web服务器是比较挫的,我们没有区分请求的类型,统一认为是GET请求,给客户端(浏览器)返回请求的内容。实际中的Web服务软件必须对不同的请求类型进行处理,今天我们通过map数据类型实现对客户端不同请求类型的处理。
实现的原理很简单,主要分为两个部分的内容:一部分是初始化一个map变量,其中Key是请求的类型,而Value是处理该请求的函数;第二部分是需要对HTTP请求的请求行进行解析,解析出请求的类型是什么。
主函数的修改
主函数的修改比较简单,主要是调用实现的代码逻辑。这里需要说明的一点是需要从全局map类型变量req_type中根据请求类型获取处理函数。然后调用该处理函数进行请求的处理。具体修改的地方如下所示。
实现的新函数
为了实现上述改变,这里实现了很多新函数,我们分别介绍一下。
建立映射关系
所谓建立映射关系就是建立请求类型的关键字与处理该请求的函数间的关系,这样就可以根据关键字获得处理函数。首先需要定义一个map类型的全局变量,并进行初始化。下面是变量的定义:
var req_type map[string]func(content_type, path, params, contents string)([]byte, []byte)
通过变量的定义我们可以看出,该map的Value类型是一个函数,而且该函数有参数和返回值。然后对改变了进行初始化,具体如下所示: [图片上传失败...(image-b0663b-1555225219775)]
实现请求处理函数 上文已经说了,每一种请求类型对应着一个处理函数。因此,我们这里将在主函数中的处理请求的逻辑封装为一个函数,以GET请求为例,函数实现如下:
其它类型请求的处理函数类似,这里不再赘述。
测试结果
我们并没有测试所有的类型,这里还是一个简单的GET请求,但足以说明问题。测试方法前面已经介绍过,我们不再废话了。下面是测试效果。