还在发愁写API文档?推荐一款阿里腾讯都在用的API管理神器
作为一个前后端分离模式开发的团队,我们经常会看到这样的场景:前端开发和后端开发在一起热烈的讨论“你这接口参数怎么又变了?”,“接口怎么又不通了?”,“稍等,我调试下”,“你再试试..."。
那能不能写好接口文档,大家都按文档来开发?很难,因为写文档、维护文档比较麻烦,而且费时,还会经常出现 API 更新了,但文档还是旧的,各种同步不一致的情况,从而耽搁彼此的时间。
之前我们团队也遇到了同样的问题,那么作为研发团队的负责人,我是如何带领团队解决这个问题的呢?
方法其实很简单,如果能做到让写文档/维护文档这件事情的短期收益就能远高于付出的成本,那么所有问题都能迎刃而解,开发人员就会非常乐意去写接口文档。
要做到写文档和及时维护文档的短期收益就能远高于付出的成本,无非两个方向:
鉴于此,我们设想如果有一款工具做到以下这些是不是就非常爽了?
总结下来,我们需要的就是这么一款工具:
为此,我们几乎尝遍了市面上所有相关的工具,但是很遗憾,没有找到合适的。
于是,我们自己实现了一个Postman + Swagger + RAP + JMeter
这个工具就是 Apifox,经常很长一段时间不断更新迭代后,我们基本上完全实现了最初的设想,几乎完美解决了最开始遇到的所有问题,在公司内部大受欢迎。并且也形成了我们自己的最佳实践。
没错,现在我们已经将Apifox产品化对外服务了,你们团队也可以直接使用Apifox了。
官网:www.apifox.cn
Apifox = Postman + Swagger + Mock + JMeter
Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台。
通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好接口文档,接口调试、数据 Mock、接口测试就可以直接使用,无需再次定义;接口文档和接口开发调试使用同一个工具,接口调试完成后即可保证和接口文档定义完全一致。高效、及时、准确!
节省研发团队的每一分钟!
如果你认为 Apifox 只做了数据打通,来提升研发团队的效率,那就错了。Apifox 还做了非常多的创新,来提升开发人员的效率。
通常一个接口会有多种情况用例,比如 正确用例 参数错误用例 数据为空用例 不同数据状态用例。定义接口的时候定义好这些不同状态的用例,接口调试的时候直接运行,非常高效。
可以独立定义数据模型,接口定义时可以直接引用数据模型,数据模型之间也可以相互引用。同样的数据结构,只需要定义一次即可多处使用;修改的时候只需要修改一处,多处实时更新,避免不一致。
使用 Apifox 调试接口的时候,系统会根据接口文档里的定义,自动校验返回的数据结构是否正确,无需通过肉眼识别,也无需手动写断言脚本检测,非常高效!
Apifox 自动校验数据结构
设置断言:
Apifox 设置断言
运行后,查看断言结果:
先放一张图对比下 Apifox 和其他同类工具 零配置 mock 出来的数据效果:
Apifox Mock 数据结果对比同类工具
可以看出 Apifox 零配置 Mock 出来的数据和真实情况是非常接近的,前端开发可以直接使用,而无需再手动写 mock 规则。
「Apifox 如何做到高效率、零配置生成非常人性化的 mock 数据」
Apifox 项目可“在线分享” API 文档,分享出去的 API 文档可设置为公开或需要密码访问,非常方便与外部团队协作。
体验地址:https://www.apipark.cn/s/ce387612-cfdb-478a-b604-b96d1dbc511b/http/5041285
根据接口模型定义,自动生成各种语言/框架(如 TypeScript、Java、Go、Swift、ObjectiveC、Kotlin、Dart、C++、C#、Rust 等)的业务代码(如 Model、Controller、单元测试代码等)和接口请求代码。目前 Apifox 支持 130 种语言及框架的代码自动生成。
更重要的是:你可以通过自定义代码模板来生成符合自己团队的架构规范的代码,满足各种个性化的需求。
接口调试
Apifox 多种主题色可选
阿里巴巴 有没有API
阿里巴巴和淘宝都开放了API接口,采用web service平台和post平台
2009年9月8日"淘园"项目核心是开放API,从即日起,第三方开发者(包括个人开发者以及企业开发者)可以通过各种开放的接口访问淘宝网数据。通过开放策略,开发者和公司可以开发各种电子商务产品,实现各种基于淘宝网底数据、模式的内外部增值应用,使得电子商务相关的产品开发和应用变得越来越丰富。
阿里云调用 API 服务后返回什么结果
返回结果
调用 API 服务后返回数据采用统一格式,返回的 HTTP 状态码为 2xx,代表调用成功;返回 4xx 或 5xx 的 HTTP 状态码代表调用失败。调用成功返回的数据格式主要有 XML 和 JSON 两种,外部系统可以在请求时传入参数来制定返回的数据格式,默认为 XML 格式。本文档中的返回示例为了便于用户查看,做了格式化处理,实际返回结果是没有进行换行、缩进等处理的。
成功结果:
错误结果
调用接口出错后,将不会返回结果数据。调用方可根据每个接口对应的错误码以及下述 2.3.3 的公共错误码来定位错误原因。当调用出错时,HTTP 请求返回一个 4xx 或 5xx 的 HTTP 状态码。返回的消息体中是具体的错误代码及错误信息。另外还包含一个全局唯一的请求 ID:RequestId 和一个您该次请求访问的站点 ID:HostId。在调用方找不到错误原因时,可以联系阿里云客服,并提供该 HostId 和 RequestId,以便我们尽快帮您解决问题。
公共错误码
错误代码
描述
Http 状态码
语义
MissingParameter ? ?The input parameter “Action” that is mandatory for processing this request is not supplied ? ?400 ? ?缺少 Action 字段 ? ?
MissingParameter ? ?The input parameter “AccessKeyId” that is mandatory for processing this request is not supplied ? ?400 ? ?缺少 AccessKeyId 字段 ? ?
MissingParameter ? ?An input parameter “Signature” that is mandatory for processing the request is not supplied. ? ?400 ? ?缺少 Signature 字段 ? ?
MissingParameter ? ?The input parameter “TimeStamp” that is mandatory for processing this request is not supplied ? ?400 ? ?缺少 Timestamp 字段 ? ?
MissingParameter ? ?The input parameter “Version” that is mandatory for processing this request is not supplied ? ?400 ? ?缺少 Version 字段 ? ?
InvalidParameter ? ?The specified parameter “Action or Version” is not valid. ? ?400 ? ?无效的 Action 值(该 API 不存在) ? ?
InvalidAccessKeyId.NotFound ? ?The Access Key ID provided does not exist in our records. ? ?400 ? ?无效的 AccessKeyId 值(该 key 不存在) ? ?
Forbidden.AccessKeyDisabled ? ?The Access Key is disabled. ? ?403 ? ?该 AccessKey 处于禁用状态 ? ?
IncompleteSignature ? ?The request signature does not conform to Aliyun standards. ? ?400 ? ?无效的 Signature 取值(签名结果错误) ? ?
InvalidParamater ? ?The specified parameter “SignatureMethod” is not valid. ? ?400 ? ?无效的 SignatureMethod 取值 ? ?
InvalidParamater ? ?The specified parameter “SignatureVersion” is not valid. ? ?400 ? ?无效的 SignatureVersion 取值 ? ?
IllegalTimestamp ? ?The input parameter “Timestamp” that is mandatory for processing this request is not supplied. ? ?400 ? ?无效的 Timestamp 取值(Timestamp 与服务器时间相差超过了 1 个小时) ? ?
SignatureNonceUsed ? ?The request signature nonce has been used. ? ?400 ? ?无效的 SignatureNonce(该 SignatureNonce 值已被使用过) ? ?
InvalidParameter ? ?The specified parameter “Action or Version” is not valid. ? ?400 ? ?无效的 Version 取值 ? ?
InvalidOwnerId ? ?The specified OwnerId is not valid. ? ?400 ? ?无效的 OwnerId 取值 ? ?
InvalidOwnerAccount ? ?The specified OwnerAccount is not valid. ? ?400 ? ?无效的 OwnerAccount 取值 ? ?
InvalidOwner ? ?OwnerId and OwnerAccount can’t be used at one API access. ? ?400 ? ?同时使用了 OwnerId 和 OwnerAccount ? ?
Throttling ? ?Request was denied due to request throttling. ? ?400 ? ?因系统流控拒绝访问 ? ?
Throttling ? ?Request was denied due to request throttling. ? ?400 ? ?该 key 的调用 quota 已用完 ? ?
InvalidAction ? ?Specified action is not valid. ? ?403 ? ?该 key 无权调用该 API ? ?
UnsupportedHTTPMethod ? ?This http method is not supported. ? ?403 ? ?用户使用了不支持的 Http Method(当前 TOP 只支持 post 和 get) ? ?
ServiceUnavailable ? ?The request has failed due to a temporary failure of the server. ? ?500 ? ?服务不可用 ? ?
UnsupportedParameter ? ?The parameter ”” is not supported. ? ?400 ? ?使用了无效的参数 ? ?
InternalError ? ?The request processing has failed due to some unknown error, exception or failure. ? ?500 ? ?其他情况 ? ?
MissingParameter ? ?The input parameter OwnerId,OwnerAccount that is mandatory for processing this request is not supplied. ? ?403 ? ?调用该接口没有指定 OwnerId ? ?
Forbidden.SubUser ? ?The specified action is not available for you。 ? ?403 ? ?无权调用订单类接口 ? ?
UnsupportedParameter ? ?The parameter ”” is not supported. ? ?400 ? ?该参数无权使用 ? ?
Forbidden.InstanceNotFound ? ?The specified Instance is not found, so we cann’t get enough information to check permission in RAM. ? ?404 ? ?使用了 RAM 授权子账号进行资源访问,但是本次访问涉及到的 Instance 不存在 ? ?
Forbidden.DiskNotFound ? ?The specified Disk is not found, so we cann’t get enough information to check permission in RAM. ? ?404 ? ?使用了 RAM 授权子账号进行资源访问,但是本次访问涉及到的 Disk 不存在 ? ?
Forbidden.SecurityGroupNotFound ? ?The specified SecurityGroup is not found, so we cann’t get enough information to check permission in RAM. ? ?404 ? ?使用了 RAM 授权子账号进行资源访问,但是本次访问涉及到的 SecurityGroup 不存在 ? ?
Forbidden.SnapshotNotFound ? ?The specified Snapshot is not found, so we cann’t get enough information to check permission in RAM. ? ?404 ? ?使用了 RAM 授权子账号进行资源访问,但是本次访问涉及到的 Snapshot 不存在 ? ?
Forbidden.ImageNotFound ? ?The specified Image is not found, so we cann’t get enough information to check permission in RAM. ? ?404 ? ?使用了 RAM 授权子账号进行资源访问,但是本次访问涉及到的 Image 不存在 ? ?
Forbidden.RAM ? ?User not authorized to operate the specified resource, or this API doesn’t support RAM. ? ?403 ? ?使用了 RAM 授权子账号进行资源访问,但是本次操作没有被正确的授权 ? ?
Forbidden.NotSupportRAM ? ?This action does not support accessed by RAM mode. ? ?403 ? ?该接口不允许使用 RAM 方式进行访问 ? ?
InsufficientBalance ? ?Your account does not have enough balance. ? ?400 ? ?余额不足 ? ?
IdempotentParameterMismatch ? ?Request uses a client token in a previous request but is not identical to that request. ? ?400 ? ?使用了一个已经使用过的 ClientToken,但此次请求内容却又与上一次使用该 Token 的 request 不一样. ? ?
RealNameAuthenticationError ? ?Your account has not passed the real-name authentication yet. ? ?403 ? ?用户未进行实名认证 ? ?
InvalidIdempotenceParameter.Mismatch ? ?The specified parameters are different from before ? ?403 ? ?幂等参数不匹配 ? ?
LastTokenProcessing ? ?The last token request is processing ? ?403 ? ?上一次请求还在处理中 ? ?
InvalidParameter ? ?The specified parameter is not valid ? ?400 ? ?参数校验失败 ? ?
阿里API网关使用总结
API网关 API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简单的操作,即可快速、低成本、低风险地开放数据或服务。
利用API网关你可以提高自己公司API安全性,也可以上架到API云市场,供用户购买和使用。
这个没什么可说的,主要是你要想办法尽可能安全地存储你的AppKey和AppSecrect。
所属分组是API的基本属性,所以需要先创建分组,再在分组下创建API。每个账号默认最多可创建100个分组,如需更多分组需要提交工单。分组有所属区域(Region)的概念,比如华东上海区,选择之后就不能修改了。创建完分组之后,系统会给该分组分配一个二级域名,供测试使用,不过,每个二级域名每天最多可访问1000次。
如果你的API支持HTTPS协议,还需要为该独立域名上传 SSL 证书。我们需要把我们的域名解析到该分组上,之后才能绑定到该分组上。绑定的域名需要现在阿里云系统备案。绑定域名之后,该分组下的API就可以通过该域名来访问了,不再需要调用系统分配的二级域名了。
在API分组的环境管理中,你可以自定义环境变量,同一个变量可以再在线上、预发和测试三个环境下对应不同的值,这样在API的定义中就可以使用这里定义好的环境变量了。可以在Path、入参默认值和后端服务服务地址中加入环境变量,在API的定义中使用环境变量需要以 #变量名# 的方式使用。 如果要修改已发布的API用到的环境变量,先把老的环境变量给删掉,再重新定义一个新的同名环境变量赋上新值之后再把全部对应的API重新发布一遍,这个是异步生效的,一般发布后1分钟内生效。
这里的内容还是蛮多的,包括基本配置,前端和后端地址,请求参数配置等,详细文档可以看阿里API的官方文档,这里说几点重要的:
创建好API之后,就可以对应用进行授权了,点击API的“授权”就可以在指定环境下授权某个APP可以访问该API了,如果你在调用API的过程中控制台打印了x-ca-message中包含了Unauthorized错误,你应该想到你的API还未对该APP进行授权访问。
API编辑完成之后就可以发布到指定环境上去了,发布之后就立马生效了。可以多次编辑然后发布到不同的环境下,如果你编辑完了忘记发布到指定环境下了,是不会生效的。在分组API列表下,直接点击API名字进入的是当前API最后一次编辑保存的状态,不一定跟发布的状态一直哦。点击API右边的线上、预发或测试后面的"运行中"可以看到在该环境下最后一次编辑发布后的状态哦。
网关会在请求的时候加上日期、时间戳、nonce、userAgent、Host、AppKey、version等参数值,如果是POST请求的话,需要对参数值进行urlEncode。如果有body值的话,需要对body值,将body中的内容MD5算法加密后再采用BASE64方法Encode成字符串,放入HTTP头中。最后再通过将httpMethod、headers、path、queryParam、formParam经过一系列的运算,合成一个字符串用hmacSha256算法双向加密进行签名。
在我们分组上绑定好了域名之后,我们不管是预发还是线上环境都可以通过这同一个域名进行访问,那网关是怎么帮我们区分环境的呢?这个时候就用到上面的环境变量管理了,我们通过在环境变量中定义一个变量在不同环境下不同的值达到区分环境的效果。在网络请求的时候,我们可以在头部指定 X-Ca-Stage 参数值来让网关帮我们转发到对应环境的后端服务上,对应的值分别是:线上(RELEASE)默认、预发(PRE)和测试(TEST)。
这里重点说一下参数位置下可选的Body选项,这个地方坑了我们蛮久。我们知道在我们客户端发起POST请求时,我们会在头部指定“Content-Type”为“application/x-www-form-urlencoded”,然后把请求的参数组装成"key1=value1&key2=value2"的字符串,然后在编码成二进制,放在请求的Body里,以Form表单的形式提交的。所以呢,我们在定义API的参数时,应该把参数位置选择为Body选项。但是我们在很长一段时间里,创建API时或编辑API时,参数位置处下拉一直没有Body选项,我们就把参数定义成了Query类型的了。在使用时也没有啥问题,但是一旦当我们的参数值非常长时,比如一个json字符串,这个是就报错了“414 Request-URI Too Large”,这个时候呢,网关就不会再帮我们把请求转发到服务端了。排查了很久终于找到了罪魁祸首在这里等着呢,通过把参数位置改成Body就可以了。这个可能是阿里API网关前端页面上的一个bug,有时候根本选不到Body选项,这个时候你可以先把“请求Body(非Form表单数据,比如JSON字符串、文件二进制数据等)”选项给勾选上,然后再取消勾选,再下拉展开“参数位置”就可以看到Body选项了。(该文发布时是如此,我已经将该问题反馈给阿里API网关,可能后面会修复该bug。)
另外一个问题是如果你的参数值中包含了emoji表情,需要对参数值进行urlEncode,服务端在收到请求时需要对参数值进行urlDecode。否则用的过程中会出现各种奇怪的问题。问了阿里网关的服务人员,他们的解释是,如果不进行urlEncode,参数在传到网关时可能会丢失。可以对所有Post请求的参数值统一urlEncode,服务端对收到的参数值统一进行urlDecode。
在使用网关时,timestamp和nonce这两个header参数值是可选的,如果加上这两个值,网关层会对请求进行校验,防止重放攻击。不过有个问题:在当前时间的前后15分钟的时间戳都是可以的,一旦超过15分钟就会请求失败,所以,如果用户修改了客户端的系统时间的话,API就会调不通了。这个校验有点严格,如果不知道这一点的话,用户反馈客户端不能用,而你这里测试又没有任何问题,那就泪奔了,哈哈。当然这个是可选的校验,如果不传这两个值的话,就不会校验,这个时候防重放攻击的工作就需要我们自己的服务端做了。
目前网关不支持multipart形式的上传,所以一般我们的上传API不太适合录入网关,阿里的说法是现在大家的做法普遍是先将文件上传到文件服务器,然后通过调用接口把文件地址等信息报错到服务器的方式,所以,目测以后也不大可能支持定义multipart形式的上传API。
每个 API 分组的默认流控上限是500QPS,如果你要调大QPS,需要提交工单并支付相应费用。另外网关有个“流量控制策略”的功能,它是针对API的,也就是说定好策略之后,选中对哪些API生效,这些API就会单独的受这个流量控制策略的控制。但是,需要注意的是,如果你要调大流量控制策略,也必须先调大API所在分组的QPS才会生效,否则流量控制策略可以创建但不会实际生效。
虽然我们可以在分组的环境管理中添加不同的环境变量来实现同一个API分组下可以定义不同服务域名的API,这样我们客户端在发起请求的时候,域名只需要配一个就可以了,非常方便。但是,一旦网关这一层瘫痪(尽管是小概率事件,但不排除),这个时候我们就心有余而力不足了,只能等网关尽快恢复了。如果我们一个分组对应一个我们真正的服务域名的话,一旦网关出问题,我们可以快速把该分组绑定的域名指向我们真正的该分组的服务上。
如何获取阿里国际站API
首先你要有全面的产品资料, 比如产品规格、参数、包装、发货、付款方式、专业的图片等等。 有了这些之后, 就可以下载阿里旺旺国际版, 在上面发布编辑产品。发布产品的时候一定要将产品分门别类, 不然会混淆