如何做好封装框架

封装原则

函数封装并不是一件很简单、很随意的事情。
相反,如何封装出易用、可读性高的函数是非常需要精心考量的,框架中每个函数的参数、返回值、命名,都代表着我们作为作者在某个事情上的思考。
 想要针对某个功能,封装出一系列比较完美的接口,更要我们从系统性的角度思考

如何封装请求和返回

在 context 这个数据结构中,封装“读取请求数据”和“封装返回数据”中的方法

读取请求数据
要读取请求数据包含哪些内容呢?
HTTP 消息体分为两个部分:HTTP 头部和 HTTP Body 体。
头部描述的一般是和业务无关但与传输相关的信息,比如请求地址、编码格式、缓存时长等;
Body 里面主要描述的是与业务相关的信息。所以针对请求数据的这两部分,我们应该设计不同的方法。
Header 信息中,包含 HTTP 的一些基础信息,比如请求地址、请求方法、请求 IP、请求域名、Cookie 信息等,是经常读取使用的,为了方便,我们需要一一提供封装。
而另外一些更细节的内容编码格式、缓存时长等,由于涉及的 HTTP 协议细节内容比较多,我们很难将每个细节都封装出来,但是它们都是以 key=value 的形式传递到服务端的,所以这里也考虑封装一个通用的方法。
Body 信息中,HTTP 是已经以某种形式封装好的,可能是 JSON 格式、XML 格式,也有可能是 Form 表单格式。其中 Form 表单注意一下,它可能包含 File 文件,请求参数和返回值肯定和其他的 Form 表单字段是不一样的,需要我们对其单独封装一个函数。
封装返回数据
封装返回数据,指的是将处理后的数据返回给浏览器。
同样,它也分为两个部分,Header 头部和 Body 体。
Header 头部,我们经常要设置的是返回状态码和 Cookie,所以单独为其封装。
其他的 Header 同样是 key=value 形式设置的,设置一个通用的方法即可。
返回数据的 Body 体是有不同形式的,比如 JSON、JSONP、XML、HTML 或者其他文本格式,所以我们要针对不同的 Body 体形式,进行不同的封装。

封装

请添加图片描述

定义接口让封装更明确(通过返回值返回接口本身)

对于比较完整的功能模块,先定义接口,再具体实现
定义一个清晰的、包含若干个方法的接口,可以让使用者非常清楚:
这个功能模块提供了哪些函数、哪些函数是我要的、哪些函数是我不要的,在用的时候,查找也更方便。

定义接口能做到“实现解耦”。使用接口作为参数、返回值,能够让使用者在写具体函数的时候,有不同的实现;而且在不同实现中,只需要做到接口一致,就能很简单进行替换,而不用修改使用方的任何代码。

使用了 QueryXXX 的系列方法来代表从 URL 的参数后缀中获取的参数;使用 ParamXXX 的系列方法来代表从路由匹配中获取的参数;使用 FormXXX 的系列方法来代表从 Body 的 form 表单中获取的参数。
三个系列的方法,我们统一了参数和返回值。
参数一般都有两个:一个是 key,代表从参数列表中查找参数的关键词;另外一个是 def,代表如果查找不到关键词,会使用哪个默认值进行返回。返回值返回两个:一个代表对应 key 的匹配值,而另一个 bool 返回值代表是否有这个返回值。

这样的设计,在获取参数的时候,能让需要处理的两个逻辑,默认参数和是否有参数,都得到很好的处理;同时对于 JSON 格式、XML 格式的 Body 结构读取,也提供了对应的方法。

对基础信息,我们提供了 URI、Method、Host、ClinetIp 等方法;对 Header 头,我们提供根据 key 获取 Header 值的通用方法;同时,也对 Cookie 单独提供了批量获取 Cookie 和按照关键词获取 Cookie 的两个方法。

对于 Header 部分,我们设计了状态码的设置函数 SetStatus/SetOkStatus/Redirect,还设计了 Cookie 的设置函数 SetCookie,同时,我们提供了通用的设置 Header 的函数 SetHeader。
对于 Body 部分,我们设计了 JSON、JSONP、XML、HTML、Text 等方法来输出不同格式的 Body。

很多方法的返回值使用 IResponse 接口本身, 这个设计能允许使用方进行链式调用。链式调用的好处是,能很大提升代码的阅读性

实现具体的接口

实现这两个接口,直接将 Context 这个数据结构,实现这两个接口定义的方法就行了。因为在 Golang 中,只要包含了接口所带的函数就是实现了接口,并不需要显式标记继承

JSONP

JSONP 是一种我们常用的解决跨域资源共享的方法,简要介绍下这个方法的原理。在 JavaScript 中使用 HTTP 请求(Ajax)会受到同源策略的限制。比如说 A 网站的页面不能在 JavaScript 中跨域访问 B 网站的资源。但是,如果我们希望能跨域访问怎么办?我们知道 HTML 中标签
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值