徒手打造express框架之手写post解析+restfulApi!

前情提要

自从上次使用python完成那个killtime迷你小框架后(参考终于!我写出了自己的后端框架! - 掘金 (juejin.cn)),一直觉得很遗憾,想破脑袋也没想明白resful api到底是怎么怎么实现,特别是我看到很多框架可以自动提取参数,感觉很有意思。后来死活也没想通就暂时搁置了,现在有空了,又使用"nodets"复现了一个类express风格的框架,看下图: get请求的参数倒是好处理,一个parse就解决了

这次感觉最大的收获就是post参数的请求,之前一直觉得Post请求很神秘,好像只有绝顶高手才能写出这样的模块,比如自己以前用过的multer,formidable

一开始自己想直接使用这些模块完成解析,谁知道出了很多错误,死活用不了,tmd! 自己写!

post解析

post解析,按照编码方式可以分成两张,urlencoded和multipart类型,具体区别参考下面: application/x-www-form-urlencoded类型数据和multipart/form-data类型数据是两种常见的用于在HTTP请求中传输表单数据的编码格式。

  1. ​application/x-www-form-urlencoded​​:

    • 编码格式简单,数据被编码为键值对的形式,以key=value的形式进行传输。
    • 键和值都需要进行URL编码(例如,空格会被编码为%20)。
    • 键值对之间使用&符号分隔。
    • 这种格式适用于简单的表单数据,不支持文件上传。
  2. ​multipart/form-data​​:

    • 编码格式复杂,适用于包含文件上传的表单数据。
    • 数据被划分为多个部分,每个部分都有自己的边界(boundary)和内容类型(content type)。
    • 每个部分包含字段的名称和对应的值,以及可选的文件数据。
    • 每个部分之间使用边界进行分隔。
    • 这种格式支持文件上传,可以同时传输文本数据和二进制文件数据。

    总结来说,application/x-www-form-urlencoded​​适用于简单的表单数据,而multipart/form-data​​适用于同时传输文本数据和二进制文件数据的复杂表单数据,如文件上传。在处理这两种类型的数据时,服务器需要根据不同的Content-Type来解析数据。对于application/x-www-form-urlencoded​​类型的数据,可以手动解析,而对于multipart/form-data​​类型的数据,一般建议使用专门的库来处理,如busboy​​或multer​​。

    以上为GPT3.5生成。

    post解析感觉还是有点繁琐的,可以瞟一眼代码:

好啦,post就告一段落了。下面是正题。

resftul api

先看看

就我个人理解,就是下面这样子:

/path/{id}/{name}

框架应该支持解析功能,比如有一个请求: /index/1/jack,restfulapi就应该可以解析出{id}对应1,{name}对应jack,然后保存起来,让用户直接使用。那怎么实现呢?且看。

restfulGet在KillTime类里面,作为一个方法,功能就是解析出用户传进来的"/rest/{id}/{name}"这样的路由,变成/rest, 保存起来,然后解析出参数名称id和name 我也没想到其他好的方法,也懒得问gpt,不然什么都问gpt,啥也不会写了。这里主要是对请求路径(如/index/1)和用户传进来(比如/index/{id})的路径分别做解析,然后创建一个对象,设置id数学为1即可。done! 下面是如何让解析出来的参数传入到回调函数的具体细节:

parseAsObject从routePath和originalPath解析出参数,做成一个对象{}返回,然后cb就是回调函数了,将req,res,和params传入,直接在回调函数中使用,完美!

killtime暂时就告一段落了,诶,终于完成了自己心心念念的restful, 睡觉!

屏幕前的帅比你觉得还可以怎么写?有什么好的想法?欢迎骚扰!

相关推荐
烂蜻蜓2 小时前
Node.js入门教程(一):初识Node.js——服务端JavaScript的诞生与特点
开发语言·javascript·node.js
凌云拓界5 小时前
NodeVerdict:Node.js 原生诊断数据可视化工具
信息可视化·架构·typescript·开源·node.js·github·bug
苏灿烤鱼6 小时前
GitHub Trending 榜首|GitHub #1 拆解|为什么「持久工作台」比临时沙箱更值得关注?(08.06)技术拆解
人工智能·typescript·agent
用户2930750976697 小时前
React Router v6 实战:理解 SPA 路由系统
node.js
星蓝_starblue20 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
用户9385156350721 小时前
从"坐电梯"到"前端路由"——深入理解 Hash 路由原理
前端·typescript·全栈
梦想CAD控件1 天前
网页端CAD的图形选择、编辑与夹点操作教程
前端·javascript·node.js
苏灿烤鱼1 天前
GitHub Trending 榜首|腾讯 Agent 记忆库技术拆解:分层记忆 vs 向量堆,让 AI 不再反复问
typescript·开源·agent
用户938515635071 天前
React 组件设计的三个层次:从类型约束到状态归属,再到纯展示
typescript·全栈
万敏1 天前
Vue3 全栈实战第四周:watch、nextTick、性能优化与 keep-alive 实战记录
vue.js·node.js·全栈