05|封装:如何让你的框架更好用?
该思维导图由 AI 生成,仅供参考
思考如何封装请求和返回
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了如何通过封装来提高框架的易用性,主要包括函数封装、请求和返回数据的封装、定义清晰的接口以及具体实现功能模块等方面。作者强调了封装出易用、可读性高的函数需要精心考量,并通过具体的代码示例展示了如何实现请求参数的获取和类型转换、路由参数的获取以及请求数据的解析和绑定。此外,还介绍了返回接口中 JSONP 输出的实现原理和方法。通过深入的技术讲解,帮助读者了解了如何通过封装来提高框架的易用性,以及如何定义接口和实现具体功能模块。文章内容丰富,涵盖了框架开发中的重要技术细节,对于想要深入了解框架设计和开发的读者具有很高的参考价值。文章还提出了一个思考题,引发读者对安全性和XSS攻击的思考,为读者提供了更多的技术思考和学习的机会。
《手把手带你写一个 Web 框架》,新⼈⾸单¥59
全部留言(11)
- 最新
- 精选
- 友不知道各位看github有没有看到 FormInt 和 FormString 我没有找到可能是粗心,建议各位在实现的时候可以在开头写上这么几句代码 var _ IRequest = new(Context) var _ IResponse = new(Context) var _ context.Context = new(Context) 如果当前context没有实现完 IRequest 和 IResponse 会报错并且你能看到是哪些接口未实现。 还有一个地方就是 Headers() map[string]string 这里接口定义的是 这样 但是试下你的时候是这样 Headers() map[string][]string
作者回复: 确实是个好办法,直接做一下强制转换能将错误提前暴露 感谢
2021-12-0211 - qinsi转义是为了防止callback名称包含任意js代码。虽然要达成XSS有各种前置条件,防御XSS也要分各种情况,没有完美的方法,但转义总比不转义要强。 疑问: 1. JSONP的响应也是在拼接字符串,是否也可以用template? 2. 对于各种请求和响应格式的支持,是否也可以写成中间件的形式,让API更精简? 3. 重复读取body的场景有哪些?我能想到的是某些访问控制的中间件可能需要事先检查body的内容。这样是不是就没法做流式处理(因为要把请求body读完才能做下一步的处理)?比如一边读取请求body一边写入响应body。
作者回复: 疑问: 1. JSONP的响应也是在拼接字符串,是否也可以用template? 当然可以的,拼接字符串有多种方式,template也是可以。 2. 对于各种请求和响应格式的支持,是否也可以写成中间件的形式,让API更精简? 可以的,修改响应格式主要要先修改下context中的responseWriter,让输出先进入到我们定义的writer中,然后修改后再输出到前端。这样做可行。 不过更多的做法是封装一个公共方法,所有api地方调用这个方法。 3. 重复读取body的场景有哪些?我能想到的是某些访问控制的中间件可能需要事先检查body的内容。这样是不是就没法做流式处理(因为要把请求body读完才能做下一步的处理)?比如一边读取请求body一边写入响应body。 这个场景很多的,要打一个输入请求的所有日志到日志管理系统中,或者要实现一个回放功能,都有可能要读取请求body.
2021-09-223 - 咸鱼有两点疑惑,为什么要使用不带error返回值的cast方法呢,这样如果解析出了问题,返回的不会是默认值,而会是零值。另外一点是我记得前面注册路由的时候把路径都变成了大写来着,这样在取路径参数的时候应该加一道把key转成大写的步骤吧,不然会找不到参数的
作者回复: 1 这里其实有三个逻辑,a 是否有这个key,b 这个key是否可以转换为目标对象, c 如果失败和没有,要怎么处理。目前是没有key返回默认值,有key但是无法转换返回零值,不过思考了一下,这里确实是改成“失败和处理”都返回默认值比较好。 2 parseParamsFromEndNode 这里传递的是request.URL.Path,是没有大写转换过的。应该不需要加这个
2021-12-121 - taoistgeekbang/05 分支里 c.SetOkStatus().Json("xxx") Content-Type不能被正确设置位application/json, 因为SetOkStatus里先执行了WriteHeader,正确做法是更新完Header后再执行 WriteHeader。 https://github.com/golang/go/issues/170832023-12-15归属地:山东11
- 木移subjectApi.Put("/:id/:id", SubjectUpdateController) 这种路由取参数就没法区分了,注册路由需要把这种情况考虑进去吗2021-10-2721
- 高。request.go 中的BindJson,BindXml这类方法真的有效么?!2022-11-05归属地:上海
- airmy丶输出解析HTML的这个地方:t, err := template.New(“output”).ParseFiles(file) 这里是否有问题?template.New 需要传入的应该是模版的文件名称吧?这里是否应该使用 filepath.Base(file) 去获取?2022-09-20归属地:广东
- 老兵利用escape template.JSEscapeString(callbackFunc) 解决XSS攻击的问题。 疑问: 但是框架如何解决CSRF攻击的问题呢?检查CSRF token和XSRF token?2022-02-24
- 牛玉富clientIp拼错了2022-01-13
- kfns0b11> // 重新填充 request.Body,为后续的逻辑二次读取做准备 > ctx.request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) 这里能详细解释一下吗?ctx.request.Body 本身是 io.ReadCloser 类型,使用 NopCloser 函数为后续的逻辑二次读取做准备是什么意思啊?2021-11-161