Golang之我想写个"web框架"-5: 获取GET请求报文提交的数据

简介: Golang之我想写个"web框架"-5: 获取GET请求报文提交的数据

这是使用go手写http协议的第4篇,本篇我们将要实现获取请求报文提交的数据,目前我们已经支持2中请求方法: 1. GET、2. POST,我们这篇文章将在Get请求上获取请求的数据。



Get中数据的提交方法


Get方法提交数据一般提交数据像这个样子的,我们将其写为uri如下:


http://127.0.0.1:8082/site?name=pdudo&site=juejin

像这样,我们其实提交了2个数据:

变量
name pdudo
site juejin



我们先不看url编码和解码,我们假设,我们的url不会涉及到解码的东西,那我们如何应该来写呢?


我们是不是得先将url给拆解一下,拆解为URL提交的参数 部分,例如我们的URIhttp://127.0.0.1:8082/site?name=pdudo&site=juejin,则可以拆解为如下形式。


image.png


我们将uri以第一个出现?进行分割,将其分割为2个部门,前面一部分,我们称之为URL,后面一部分称之为提交的参数。



完成一个简单的请求

这个代码,我们应该怎么写呢? 我们可以先定义能够接收参数的容器,我们直接加在RequestInfo上即可。

image.png


那我们什么时候来判断呢? 我们可以在每次报文请求来的时候,如果请求方法为GET,那我们就进行抓取参数,参数抓出来,我们放置到上述map中,那么如何进行抓取呢,逻辑如我们上述所示,我们对URI的第一个?进行拆分,拆分之后,我们再进行按照&进行拆分,左边为key,右边为value,由于逻辑较为简单,就不画图了,我们直接看代码吧。


image.png

这样的话,就将参数写到了我们定义的map中,我们在路由函数中,直接进行获取map的数据即可,例如,我的URL``http://127.0.0.1:8082/site?name=pdudo&site=juejin格式是这样的,我想获取namesite的值,我门在定义路由函数中,就可以这样写:

image.png


功能测试


我们可以来尝试一下

我们使用curl来请求一下

image.png

web日志为

image.png


我们也可以在浏览器尝试一下

image.png


额,我们发现乱码了,我们可以添加一个响应报文的首部行,名称为: Content-Type值为: text/html;charset=utf-8,我们尝试一下。

image.png


再次访问浏览器,则没有报错了



我们还需要URL解码


上述需求,我们写完了,结果真的如此么? 我们请求一个中文名称的url呢,例如

image.png


我们代码也改了

image.png


但是实际上,输出为空,这是为什么呢? 好在我们输出了SampleHttp.HttpInfo 的值,我们可以看下解析的map信息。

image.png


为什么会解析为这个样子呢? 不要急,我们找一个urldecode的站点解析一下就可以了。

image.png


确实是我们需要的名称,那为什么会这样呢? 这个就要涉及到 url编码了,在url编码规则中,除了字母、数字、以及一些常用的符号在请求的时候,不会进行编码外,其他的,都会进行编码。编码会将字符解析为16进制的数据,然后再发到服务器,服务器接受后,需要解码,才能得到原始数据。



定义解码数据函数


go中,我们可以使用url.QueryUnescape()来解码数据,我还专门去看了一下


例如:

url.QueryUnescape("%E5%90%8D%E5%AD%97")

例如,如上代码则返回解码后的数据: "名字"。


关于解码代码,我看了一下,没怎么看懂,不过我给借鉴了过来,写到我们自己的项目中,这里给一个假设,假设我们传入的URL编码都是正确的。我们的解码代码可以编写如下:

image.png

我们再修改一下worker函数传入的数据进行解密,

image.png



功能测试


我们测试下

image.png

查看我们打印的info值,我们可以看到map中已经变为中文了,赞。

image.png



总结


我们本次的功能,是解析GET请求上发送的数据,大致可以分为2个部分,1. 截取数据部分 2. 进行URL解码 ,这里其实有一个bug,就是我们只解析了截取的数据部分,若我们路由带有中文的话,我们没办法解析的,不管怎么说,我们代码已经实现了,其代码已经上传到了gitee: gitee.com/pdudo/Sampl… , 快来试试吧。



相关文章
|
5月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
5月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
545 1
|
9月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
9月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
9月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
11月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
569 35
|
11月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
1627 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
5月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
310 2
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
746 4
Golang语言之管道channel快速入门篇

热门文章

最新文章

推荐镜像

更多