多平台统一管理软件接口,如何实现多平台统一管理软件接口
480
2023-03-04
本文目录一览:
设计时通过将请求和响应之间的不同部分隔离来让事情变得简单。保持简单的规则让我们能更关注在一些更大的更困难的问题上。
请求和响应将解决一个特定的资源或集合。使用路径(path)来表明身份,body来传输内容(content)还有头信息(header)来传递元数据(metadata)。查询参数同样可以用来传递头信息的内容,但头信息是首选,因为他们更灵活、更能传达不同的信息。
所有的访问API行为,都需要用TLS通过安全连接来访问。没有必要搞清或解释什么情况需要TLS 什么情况不需要TLS,直接强制任何访问都要通过 TLS。
理想状态下,通过拒绝所有非TLS请求,不响应http或80端口的请求以避免任何不安全的数据交换。如果现实情况中无法这样做,可以返回403 Forbidden响应。
把非TLS的请求重定向(Redirect)至TLS连接是不明智的,这种含混/不好的客户端行为不会带来明显好处。依赖于重定向的客户端访问不仅会导致双倍的服务器负载,还会使 TLS 加密失去意义,因为在首次非TLS调用时,敏感信息就已经暴露出去了。
制定版本并在版本之间平缓过渡对于设计和维护一套API是个巨大的挑战。所以,最好在设计之初就使用一些方法来预防可能会遇到的问题。
为了避免API的变动导致用户使用中产生意外结果或调用失败,最好强制要求所有访问都需要指定版本号。请避免提供默认版本号,一旦提供,日后想要修改它会相当困难。
最适合放置版本号的位置是头信息(HTTP Headers),在 Accept 段中使用自定义类型(contenttype)与其他元数据(metadata)一起提交。例如:
在所有返回的响应中包含ETag头信息,用来标识资源的版本。这让用户对资源进行缓存处理成为可能,在后续的访问请求中把If-None-Match头信息设置为之前得到的ETag值,就可以侦测到已缓存的资源是否需要更新。
为每一个请求响应包含一个Request-Id头,并使用UUID作为该值。通过在客户端、服务器或任何支持服务上记录该值,它能为我们提供一种机制来跟踪、诊断和调试请求。
一个大的响应应该通过多个请求使用Range头信息来拆分,并指定如何取得。详细的请求和响应的头信息(header),状态码(status code),范围(limit),排序(ordering)和迭代(iteration)等,参考 Heroku PlatformAPI discussion of Ranges .
在 PUT/PATCH/POST 请求的正文(request bodies)中使用JSON格式数据,而不是使用form 表单形式的数据。这与我们使用JSON格式返回请求相对应,例如:
资源名 (Resource names):使用复数形式为资源命名,除非这个资源在系统中是单例的 (例如,在大多数系统中,给定的用户帐户只有一个)。 这种方式保持了特定资源的统一性。
行为 (Actions):好的末尾不需要为资源指定特殊的行为,但在特殊情况下,为某些资源指定行为却是必要的。为了描述清楚,在行为前加上一个标准的actions:
例如:
为了和域名命名规则保持一致,使用小写字母并用 - 分割路径名字,例如:
属性也使用小写字母,但是属性名要用下划线 _ 分割,以便在Javascript****中省略引号。例如:
在某些情况下,让用户提供ID去定位资源是不方便的。例如,一个用户想取得他在Heroku平台app信息,但是这个app的唯一标识是UUID。这种情况下,你应该支持接口通过名字和ID都能访问,例如:
不要只接受使用名字而放弃了使用id。
在一些有父路径/子路径嵌套关系的资源数据模块中,路径可能有非常深的嵌套关系,例如:
推荐在根(root)路径下指定资源来限制路径的嵌套深度。使用嵌套指定范围的资源。在上述例子中,dyno属于app,app属于org可以表示为:
为每一次的响应返回合适的HTTP状态码。好的响应应该使用如下的状态码:
200: GET请求成功,及DELETE或PATCH同步请求完成,或者PUT同步更新一个已存在的资源;
201: POST同步请求完成,或者PUT同步创建一个新的资源;
202: POST,PUT,DELETE,或PATCH请求接收,将被异步处理;
206: GET 请求成功,但是只返回一部分;
使用身份认证(authentication)和授权(authorization)错误码时需要注意:
401 Unauthorized: 用户未认证,请求失败;
403 Forbidden: 用户无权限访问该资源,请求失败;
当用户请求错误时,提供合适的状态码可以提供额外的信息:
422 Unprocessable Entity: 请求被服务器正确解析,但是包含无效字段;
429 Too Many Requests: 因为访问频繁,你已经被限制访问,稍后重试;
500 Internal Server Error: 服务器错误,确认状态并报告问题.
对于用户错误和服务器错误情况状态码,参考: ** **HTTP response code spec
提供全部可显现的资源表述 (例如:这个对象的所有属性) ,当响应码为200或是201时返回所有可用资源,包含 PUT/PATCH和 DELETE 请求,例如:
当请求状态码为202时,不返回所有可用资源,例如:
在默认情况给每一个资源一个id属性。除非有更好的理由,否则请使用UUID。不要使用那种在服务器上或是资源中不是全局唯一的标识,尤其是自动增长的id。
生成小写的UUID格式 8-4-4-4-12,例如:
为资源提供默认的创建时间 created_at 和更新时间 updated_at,例如:
有些资源不需要使用时间戳那么就忽略这两个字段。
仅接受和返回UTC格式的时间。ISO8601格式的数据,例如:
使用嵌套对象序列化外键关联,例如:
而不是像这样:
这种方式尽可能的把相关联的资源信息内联在一起,而不用改变资源的结构,或者引入更多的顶层字段,例如:
响应错误的时,生成统一的、结构化的错误信息。包含一个机器可读的错误 id,一个人类可读的错误信息(message),根据情况可以添加一个url来告诉客户端关于这个错误的更多信息以及如何去解决它,例如:
文档化错误信息格式,以及客户端可能遇到的错误信息id。
客户端的访问速度限制可以维护服务器的良好状态,保证为其他客户端请求提供高性的服务。你可以使用 token bucket algorithm 技术量化请求限制。
为每一个带有RateLimit-Remaining响应头的请求,返回预留的请求tokens。
请求中多余的空格会增加响应大小,而且现在很多的HTTP客户端都会自己输出可读格式("prettify")的JSON。所以最好保证响应JSON最小化,例如:
而不是这样:
你可以提供可选的方式为客户端提供更详细可读的响应,使用查询参数(例如:?pretty=true)或者通过Accept头信息参数(例如:Accept:application/vnd.heroku+json;version=3; indent=4;)。
提供一个机器可读的模式来恰当的表现你的API。使用 prmd 管理你的模式,并且确保用prmd verify验证是有效的。
提供人类可读的文档让客户端开发人员可以理解你的API。
如果你用prmd创建了一个概要并且按上述要求描述,你可以为所有节点很容易的使用prmd doc生成Markdown文档。
除了节点信息,提供一个API概述信息:
提供可执行的示例让用户可以直接在终端里面看到API的调用情况,最大程度的让这些示例可以简单的使用,以减少用户尝试使用API的工作量。例如:
如果你使用 prmd 生成Markdown文档,每个节点都会自动获取一些示例。
描述您的API的稳定性或是它在各种各样节点环境中的完备性和稳定性,例如:加上原型版(prototype)/开发版(development)/产品版(production)等标记。
更多关于可能的稳定性和改变管理的方式,查看 ** **Heroku API compatibility policy
一旦你的API宣布产品正式版本及稳定版本时,不要在当前API版本中做一些不兼容的改变。如果你需要,请创建一个新的版本的API。
具体如下:
一、标准共分三大类:
1.石油设备设计及制造规范;
2.石油设备使用及维护推荐做法;
3.钻井及采油作业推荐做法。
目前api接口设计规范,API公布api接口设计规范了已用于API产品认证的54项产品规范。
二、API标准化政策
美国石油学会规范的出版api接口设计规范,有利于采购标准化的材料和设备api接口设计规范,同时也是为api接口设计规范了制造商生产符合本会相应规范的材料或设备提供指导。这些规范不是旨在排队优良技术的需求,也不以任何方式阻碍任何人购买生产符合其它规范的产品。制定、发布API规范和API质量纲要规范,绝非旨在限制买主向未授权使用API会标的制造商购买产品。
API规范可供愿意执行规范的所有人使用。本会已做出不懈的努力,以保证其规范数据的准确性和可靠性。但是,本会对出版任何一个API规范都不表态担保和保证,并声明:凡因使用API规范而造成的损失或损坏所引起的责任和义务,API均不予以承担。
凡在自己生产的设备或材料上标有某一API规范的制造商,均有责任遵守该规范的全部条款。但API对其产品是否确实符合相应的API规范不作任何表态、担保和保证。
三、API认证介绍
1.API会标API会标是美国石油学会的学会标志。该标志经美国注册登记,未经许可任何人不得使用。
2.API取证API取证即通过一个申请、检查、确认程序,有API向产品技术商符合API产品规范、质量保证体系符合API质量纲要规范的制造厂授予证书,允许制造厂在其产品上使用API会标标志。API取证的实质是商标转让使用的授权活动。
3.API对会标的说明
(1)只授予通过API认证的制造厂
(2)不是对制造厂的担保
(3)不是对设计的赞同
(4)不是对产品的担保
(5)制造厂保证经确认的产品,每一个都符合制造时的API规范
(6)API承认制造厂在遵守制定的API标准方面受到了API的信任
四、API认证的需求
API认证从过去的潜在需求,在加入WTO的进程中,变为了显在的需求,石油机械产品的定货中,越来越注重API产品的质量认可,是由于API在石油行业的特殊地位所决定。API在美国国内及国外都享有很高的声望,它所制定的石油化工和采油机械技术标准被许多国家采用,它是美国商业部和美国贸易委员会承认的石油机械认证机构。API的认证标志在国际上也享有很高的信誉。佩带API标志的石油机械不仅被认为是质量可靠而具有先进水平,当然,价格也较高。
企业普遍反映API认证的费用太高。确实,就算是在欧美发达国家,认证也是一笔较高的投入。从很现实的角度来看,认证的费用最终是由购买者承担,企业在认证上的投入实际上应视为是产品附加值提高的技术成本投入。
中东、南美和亚洲许多国家的石油公司在招标采购石油机械时,一般都要求佩有API标志的产品才能有资格参加投标。
API对申请认证的产品不要求强制性的实验室检测,但对涉及石油、天然气的采集、加工行业的各种设备,API提出了55种详细规范。如,6D规范涉及管线阀门,包括球阀、闸阀、止回阀等。这些规范规定了产品需满足的最低要求。虽然无强制检测,但API的观察员会检查厂家递交的产品计划书,确保厂方在生产过程中执行产品规范体系。
本接口设计规范,参考了restfull的部分设计理念。
资源是 Restful API 的核心元素,所有的操作都是针对特定资源进行的。
任何事物,只要有被引用到的必要,它就是一个资源。资源可以是实体(例如手机号码),也可以只是一个抽象概念(例如价值) 。下面是一些资源的例子:
Github 可以说是这方面的典范,下面我们就拿 repository 来说明。
我们可以看到几个特性:
接口名称应简单明了,望文知意,接口简介中,需描述清楚接口的具体业务功能。
原则上,接口命名规范整体采用“名词”+“动词”形式
接口返回或者操作的是单个资源对象,采用名称的单数形式命名,如:/user/add,/user/del,/user/get
接口返回或者操作的是多个资源对象,采用名称的复数形式命名,如:/users/get
针对同一个接口,根据实际业务需求,为解决接口兼容性问题,可以对接口进行版本扩展,命名规范为“名词”+“动词”+“版本号”形式,版本号采用v1、v2、v3形式命名
例:/user/login ,/user/login/v1
接口返回值,将统一采用如下格式:
{
"sign": "f64b967289ac4d8cbfdc22ad30ec9d09",
"content": "{}",
"timestamp": 1561204602005,
"desc": "成功!",
"code": "000",
"accessToken": "83BAED4DAE9DEF783FDE243F4B5C"
}
sign:返回值签名验签(如果需要)
如遇第三方合作等特殊情况,根据实际情况进行设计。
一个接口只做一件事情
连字符"-"一般用来分割URI中出现的字符串(单词),来提高URI的可读性,使用下划线"_"来分割字符串(单词)可能会和链接的样式冲突重叠,而影响阅读性。
根据RFC3986定义,URI是对大小写敏感的,所以为了避免歧义,我们尽量用小写字符。
例,针对金额,都统一为amount,而不是有的amount,有的money。
如是对老接口进行改动,需考虑接口的兼容性,包括字段的增减、字段名称调整、字段类型的调整、字段值内容长度的调整,字段值取值范围的调整等。
接口一旦发布就不易修改,要保持兼容性,拼写错误也不能改了,所以要仔细检查拼写。
著名悲剧:unix 的 creat。
creat是一个函数,可以用来创建一个文件并以只写的方式打开。
参数命名最好是定语+名词
比如 fileName, maxSize, textColor,而不是用name、size、colour
不要用生僻单词,也不要用汉语拼音
除非是约定俗成已经被广泛使用的缩写,否则老老实实用完整拼写。
比如 有open就要有close,有login就要有logout,这些单词基本是固定搭配的,使用者就很容易理解。
例,业务需要vip用户,接口不允许设计为isVipUser,而应该设计为获取用户的会员等级接口,/user/level/get,这样保证接口的通用性和扩展性
分页相关接口参数命名统一:
pageSize:每页记录条数
pageNum:当前页数
totalPageNum:总共页数
统一以分为单位进行传递
建议统一以时间毫秒数进行传递,避免前后端或者各种场景下日期格式不统一
API接口,类似 http://mypay.com/refund/order_id=123mch_id=123 ,这个请求我以商户mch_id=123的身份给订单号为order_id=123退款,如果服务器不辩别请求发起者的身份直接做相应的操作,那是及其危险的。
一般的,在PC端,我们是通过加密的cookie来做会员的辨识和维持会话的;但是cookie是属于浏览器的本地存储功能。APP端不能用,所以我们得通过token参数来辨识会员;而这个token该如何处理呢?
延伸开来,接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用。
一般来说,在前端对数据做加密或者前面,是不现实的。前后端使用HTTP协议进行交互的时候,由于HTTP报文为明文,所以通常情况下对于比较敏感的信息可以通过在前端加密,然后在后端解密实现"混淆"的效果,避免在传输过程中敏感信息的泄露(如,密码,证件信息等)。不过前端加密只能保证传输过程中信息是‘混淆’过的,对于高手来说,打个debugger,照样可以获取到数据,并不安全,所谓的前端加密只是稍微增加了攻击者的成本,并不能保证真正的安全。即使你说在前端做了RSA公钥加密,也很有可能被高手获取到公钥,并使用该公钥加密数据后发给服务端,所以务必认为前端的数据是不可靠的,服务端要加以辩别。敏感信息建议上https。
所以一般建议上https,敏感信息md5混淆,前端不传输金额字段,而是传递商品id,后端取商品id对应的金额,将金额等参数加签名发送到支付系统。金额可以是明文的。
token授权机制 :用户使用用户名密码登录后,后台给客户端返回一个token(通常是UUID),并将Token-UserId键值对存储在redis中,以后客户端每次请求带上token,服务端获取到对应的UserId进行操作。如果Token不存在,说明请求无效。
弊端 :token可以被抓包获取,无法预防MITM中间人攻击
用户每次请求都带上当前时间的时间戳timestamp,服务器收到请求后对比时间差,超过一定时长(如5分钟),则认为请求失效。时间戳超时机制是防御DOS攻击的有效手段。
将token,timestamp等其他参数以字典序排序,再加上一个客户端私密的唯一id(这种一般做在服务端,前端无法安全保存这个id)或使用私钥签名,将前面的字符串做MD5等加密,作为sign参数传递给服务端。
地球上最重要的加密算法:非对称加密的RSA算法。公钥加密的数据,可以用私钥解密;私钥签名(加密)的数据,可以用公钥验签。
RSA原理是对极大整数做因数分解,以下摘自维基百科。
暂时比较忙没时间,将于7月29日晚更新。
来更新啦。
微信支付安全规范,可以查看官方文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
第1点中,其签名算法最重要的一步,是在最后拼接了商户私密的API密钥,然后通过md5生成签名,这时即使金额是明文也是安全的,如果有人获取并修改了金额,但是签名字段他是无法伪造的,因为他无法知道商户的API密钥。当然,除了微信支付的拼接API生成签名的方法,我们也可以通过java自带的security包进行私钥签名。其中nonce随机字符串,微信支付应该做了校验,可以防止重放攻击,保证一次请求有效,如果nonce在微信支付那边已经存在,说明该请求已执行过,拒绝执行该请求。
阮一峰老师的博客-RSA算法原理: http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
维基百科: https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~