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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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… , 快来试试吧。



相关文章
|
2月前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
101 0
|
26天前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
40 3
|
2月前
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
112 0
|
2月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
75 0
|
3月前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
91 1
|
3月前
|
SQL 存储 安全
Web安全-CSRF跨站请求伪造
Web安全-CSRF跨站请求伪造
96 5
|
4月前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
146 0
|
4月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
61 0
|
4月前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
73 0
|
4月前
|
开发者 Java Spring
【绝技揭秘】掌握Vaadin数据绑定:一键同步Java对象,告别手动数据烦恼,轻松玩转Web应用开发!
【8月更文挑战第31天】Vaadin不仅是一个功能丰富的Java Web应用框架,还提供了强大的数据绑定机制,使开发者能轻松连接UI组件与后端Java对象,简化Web应用开发流程。本文通过创建一个简单的用户信息表单示例,详细介绍了如何使用Vaadin的`Binder`类实现数据绑定,包括字段与模型属性的双向绑定及数据验证。通过这个示例,开发者可以更专注于业务逻辑而非繁琐的数据同步工作,提高开发效率和应用可维护性。
96 0