解读:再谈 API 的撰写 - 总览
优采云 发布时间: 2022-11-08 14:37解读:再谈 API 的撰写 - 总览
背景
去年我写了一篇文章 文章:编写合格的 REST API。当时,Juniper 在德州裁掉了我们十多人的团队。在过去的六个月里,该团队中有一半人一直在研究 REST API。当我接手工作时,我发现那些 API 写得很业余,没有考虑几个基本的 HTTP/1.1 RFC(2616、7232、5988 等)的实现,所以我花了一些时间重写并写了 文章。
从今天来看,我当时搭建的系统也有很多问题,很多API之外的问题都没有考虑:
理想情况下,一旦编写了 API,它应该能够自动生成文档和测试用例,并且 API 系统还应该提供一整套用于生成指标的统计 API。默认情况下,API 系统本身应该采集很多指标,例如每个 API 的响应时间、状态码等,使用 collectd/statd 来采集信息,并可以进一步发送给 datadog/new relic 等 APM 系统。
在 adRise,我们有一个运行了几年的 API 系统,不符合 RFC,(几乎)未记录,(几乎)未测试,(几乎)未监控,最糟糕的是,它既不具备开发效率,也不具备高运营效率。所以,在过去的一两个月里,我领导了一个全新的 API 系统的开发。
目标
在建立一个新的系统之前,我们需要建立一些目标。以下是我在设计 API 时写下的一些目标:
其中,内省收录两层含义:
选择
有了以上目标,下一步就是进行技术选型。技术选择不能独立于团队来完成。如果我个人选择基础语言和框架的话,我可能会选择基于 Erlang/OTP 的 Phoenix,使用 Elixir 开发的 Phoenix,或者干脆使用 Plug(Phoenix 的基石)。因为 Plug/Phoenix 通过组合构建管道的方式符合我的思路,Elixir 对宏的支持以及 Erlang 语言核心的模式匹配使得路由等子系统高效、简洁、美观,而 Erlang/OTP 在高并发下具有健壮性又是一个 API 系统努力的方向。
但是,我需要考虑团队的实际情况。在 adRise,我们使用 node.js 作为后端的主要技术栈(以及一些 PHP/Python/scala),所以 API 系统最好基于 node.js 来完成。node.js下适合写API的框架有很多,比如express、restify、hapi、loopback、sails.js等,综合回顾了这些框架后,我选择restify有三个原因:
事实证明,这是一个相当不错的选择。
基本框架设置好之后,接下来就是选择核心组件了。第一个是验证器。很多人在搭建系统的时候不关注验证者,或者没有统一的视角去看待验证者,这样不好。任何系统的运行环境都是一个肮脏的世界,到处都是鬼、鬼、污;而我们希望系统本身是清净的,是极乐净土,我们该怎么办?
简单、干净的输入和输出。对于 API,允许使用哪些标头、正文和查询字符串?什么样的响应机构有资格?这需要明确定义。所以我们需要一个合适的验证器。如果说选帧就像Shiro的选秀姑娘,换飞燕手会让你眼花缭乱,选择validator就像姜维的观点。看来只能用王平和廖化了。在github上逛了半天,最后只能用joi和json schema。
json schema其实很好用,非常接近各种API工具的schema(swagger直接使用json schema),可惜太冗长了,让程序员写这个有点太冗长了:
{
"title": "Example Schema",
"type": "object",
<p>
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": ["firstName", "lastName"]
}</p>
而joi是hapi提供的validator,界面非常人性化,同样的schema,描述的代码量只有前者的1/3:
joi.object().keys({
firstName: joi.string().required(),
lastName: joi.string().required(),
<p>
age: joi.number().min(0).description('Age in years'),
});</p>
而且它还可以很方便的将输出(当然需要各种适配)反向输出为json schema。输出为 json 模式有什么好处?可以用来生成swagger doc!swagger 是一种 API 描述语言,它定义了客户端和服务器之间的协议。swagger doc 可以生成 API 文档和测试 UI,例如:
在接下来的 文章 中,我将详细介绍 swagger。
让我们再看看ORM。经常使用 express 的同学应该明白,express 本身并不会过多地干扰您访问数据的方式。任何人都可以根据自己的需要使用自己需要的数据访问方式:可以是raw db access,也可以是ORM。在团队中工作时,这种灵活性会受到伤害。它使每个人都可以轻松地编写风格非常不一致的代码。而且,数据库写入和读取数据的规范化也将在没有 ORM 的情况下带来好处。大量的临时代码。因此,尽管带有所有臭名昭著的 ORM,我还是想在涉及数据访问的级别使用 ORM。
我们系统的数据库是异构的。因此,只对一种类型的数据库有效的纯种 ORM,例如 Mongoose / Sequelize,是不适合的。最好的选择是接口支持多种不同的数据库。当需要特殊查询或者操作时可以切换到原生的ORM。这样,工程师的效率和系统的效率就达到了平衡。在 node.js 下,这样的 ORM 并不多,似乎只有 waterline 可用。waterline 是sails.js 的开源ORM,支持多种数据库的混合使用。在各个数据库无法统一的操作界面上(比如mongodb的upsert),可以很方便的将其生成的模型转成native,直接使用数据库。界面。
另外,水线模型的schema采用json描述,便于在系统导入导出时转换成joi schema进行校验。
// waterline schema
const attributes = {
user_id: { type: 'integer', required: true },
content_id: { type: 'integer', required: true },
content_type: { type: 'string', required: true },
}
接下来是日志系统。一个 API 系统可能收录多个服务器,因此需要集中采集、处理和可视化日志。一般来说,我们可以使用ELK,或者第三方服务。如果在系统设计之初就考虑日志的集中管理,那么日志的采集应该考虑结构化的结构而不是字符串。虽然用grok可以处理字符串,但毕竟效率低下,而且必须为每个日志编写grok表达式。由于node restify默认使用bunyan做日志,而bunyan可以生成json格式的日志,直接满足了我们的需求。
最后,让我们看一下测试框架。一个合格的系统离不开一个合适的测试框架。我的选择是 ava/rewire/supertest/nyc。ava是一个单元测试框架,类似于mocha/tape等常见的测试框架,解决了同样的问题,但是ava可以并发执行,效率很高,对es6有很好的支持,测试用例可以返回Promise,ava处理剩下的事情。有时我们需要测试一个模块中没有导出的函数,或者在测试的时候Mock一些我们不关心的函数。Rewire 可以轻松处理此类问题。supertest可以做API级别的测试,也就是功能测试,可以用nyc做测试覆盖。
今天就讲这么多,下一次讲如何构建一个API系统。
解读:学会这一点,无视优采云采集规则自动采集发布
做过网站的SEO网站管理员知道,如果他们想始终如一地输出网站高质量的内容。不建议靠人工编辑,一站还是可以坚持的,10、50个都很难坚持,所以我们需要用优采云采集器这样的文章采集器。
首先,我们来谈谈优采云车采集器,作为一款老牌采集工具,作为一款老牌采集工具,在互联网采集行业站稳了脚跟。然而,随着互联网时代的快速发展,不便之处开始出现。
优采云采集器是收费的。你可能会说我可以使用优采云采集器的破解版本。好吧,你可以这么说,但是使用过优采云采集器的网站管理员知道,使用优采云采集需要我们编写采集规则。说哪些站长会编码是可以的,但大多数站长都不懂所谓的采集规则,更别说正则表达式了。这已经让不少小白站长望而生畏。另一个原因是使用优采云采集器采集需要的配置参数太多。例如采集批量采集页面链接被添加到需要指定第一项、容差和项目数的需要中。当需要大量具有不同参数和不同页面的采集数据时,不可能为每个任务手动设置。
市场上有方便且功能强大的免费采集工具吗?有些人一定有,最近找到了优采云采集器替代产品,使用起来非常方便,可以采集任何新闻来源,最重要的是,它永远免费,因为开发人员厌倦了哪些采集软件打着免费的旗号,做一些有偿的事情。他看穿了自己受不了了,所以干脆自己写了一套免费的采集工具。这里只是SEO分享,没有推荐。
首先,通过设置关键词,选择
采集数据源,选择文章 采集的存储路径,选择关键词采集中的文章数,然后键入并接收,整个过程不到1分钟。每天挂断电话采集还要同步完成发布任务和推送任务。
搜索引擎优化是多维的。我们需要做好SEO站内优化和站外华,我们站长的每一个环节都做得很好,那么你网站不被搜索引擎喜欢就没有意义了。这就是今天分享的全部内容,或者那句话我受到启发成为一名 SEO 布道者,我对分享 SEO 是认真的。不明白可以留言评论区,点赞关注,下期我会分享更多SEO相关的干货!