api 接口设计(API接口设计规范)

网友投稿 294 2023-02-02

本篇文章给大家谈谈api 接口设计,以及API接口设计规范对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享api 接口设计的知识,其中也会对API接口设计规范进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

开放平台API接口安全性设计——微信支付为例

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

什么是API接口?主要作用是什么?

API英文全称为api 接口设计:Application Programming Interfaceapi 接口设计,中文意思是应用程序编程接口,它是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力。

主要作用:

API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。

扩展资料:

API数据接口的好处:

1、良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。应用程序接口是一组数量上千、极其复杂的函数和副程序,可让程序员做很多任务。

2、98数据致力于打造高质量API,除了自身的数据外,来自合作伙伴的各类API数据也是经过慎重的筛选,接口的质量和稳定性比较好,适合对接口质量和稳定性有较高要求的开发者。API数据接口作为众多开发人员进行开发工作最有效的助手,以后也会发挥着更大的作用,所以找到合适的接口才是最为重要的。

参考资料来源:百度百科-api

Django REST framework框架之GET, POST, PUT, PATCH, DELETE等API请求接口设计

一、API接口功能需求:设计一些接口URL,让前端/客户请求这个URL去获取数据并显示,更改数据(增删改查),达到前后端分离的效果

二、设计逻辑:通过http协议请求方式GET、POST、PUT、PATCH、DELETE设计符合RESTful规范的api接口也就是URL

三、简易源码:

3.序列化serializers
#导入模型类和rest_framework序列化模块serializers
from .models import Article
from rest_framework import serializers

#定义序列化类,使用继承ModelSerializer方法
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article #指定序列化的模型类
fields = '_ all _' #选取序列化字段,此处可自行选取字段

4.视图函数views
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Article
from .serializers import ArticleSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
#调用csrf装饰器csrf_exempt模块,解决跨域访问问题
#JSONRenderer它将Python的dict转换为JSON返回给客户端
#JSONParser 负责将请求接收的JSON数据转换为dict

#写法一
#在需要跨域的视图上调用装饰器@csrf_exempt
@csrf_exempt
def article_list(request):
if request.method == 'GET':
arts = Article.objects.all() #获取模型类数据
ser = ArticleSerializer(instance=arts,many=True) #序列化数据instance
#下一步用rest_framework方法里的JSONRenderer方法渲染数据
json_data = JSONRenderer().render(ser.data)
return HttpResponse(json_data,content_type='application/json',status=200)

#写法二
class JSONResponse(HttpResponse):
def _ init (self,data,**kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse, self)._ init (content,**kwargs)

#根据id进行增删改操作接口
@csrf_exempt
def article_detail(request,id):
try:
art = Article.objects.get(id=id)
except Article.DoesNotExist as e:
return HttpResponse(status=404)

备注:
*写法二中定义JSONResponse类将返回的数据data与content_type返回类型做了封装
*API接口
GET/POST
api/articles
GET/PUT/PATCH/DELETE
api/articles/1
*Postman测试效果图

API 设计规范

设计时通过将请求和响应之间的不同部分隔离来让事情变得简单。保持简单的规则让我们能更关注在一些更大的更困难的问题上。

请求和响应将解决一个特定的资源或集合。使用路径(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。

RESTful api接口安全优雅设计

-- 陈万洲

在项目中,需要为APP撰写API。刚开始接触的时候,并没有考虑太多,就想提供URL,APP端通过该URL进行查询、创建、更新等操作即可。但再对相关规范进行了解后,才发现,API的设计并没有那么简单,远远不是URL的问题,而是一个通信协议的整体架构

请求模式也可以说是动作、数据传输方式,通常我们在web中的form有GET、POST两种,而在HTTP中,存在下发这几种。

常见的请求参数

比如在数据过多, 需要对数据进行分页请求的时候, 我们应该统一 API 请求参数. 常见的有这些.

API的开发直接关系了APP是否可以正常使用,如果原本运行正常的API,突然改动,那么之前使用这个API的APP可能无法正常运行。APP是不可能强迫用户主动升级的,因此,通过API版本来解决这个问题。也就是说,API的多个版本是同时运行的,而且都要保证可以正常使用。

按照RESTful的规范,不同的版本也应该用相同的API URL,通过header信息来判断版本,再调用不同版本的程序进行处理。但是这明显会给开发带来巨大的成本。

解决办法有以下几种:

接口的数据一般都采用JSON格式进行传输,不过,需要注意的是,JSON的值只有六种数据类型:

所以,传输的数据类型不能超过这六种数据类型。以前,我们曾经试过传输Date类型,它会转为类似于"2016年1月7日 09时17分42秒 GMT+08:00"这样的字符串,这在转换时会产生问题,不同的解析库解析方式可能不同,有的可能会转乱,有的可能直接异常了。要避免出错,必须做特殊处理,自己手动去做解析。为了根除这种问题,最好的解决方案是用毫秒数或者字符串表示日期。

服务器返回的数据结构,一般为:

不同错误需要定义不同的返回码,属于客户端的错误和服务端的错误也要区分,比如1XX表示客户端的错误,2XX表示服务端的错误。这里举几个例子:

错误信息一般有两种用途:一是客户端开发人员调试时看具体是什么错误;二是作为App错误提示直接展示给用户看。主要还是作为App错误提示,直接展示给用户看的。所以,大部分都是简短的提示信息。

data字段只在请求成功时才会有数据返回的。数据类型限定为对象或数组,当请求需要的数据为单个对象时则传回对象,当请求需要的数据是列表时,则为某个对象的数组。这里需要注意的就是,不要将data传入字符串或数字,即使请求需要的数据只有一个,比如token,那返回的data应该为:

首先,使用https可以在数据包被抓取时多一层加密。我们现在的APP使用环境大部分都是在路由器WIFI环境下,一旦路由器被入侵,那么黑客可以非常容易的抓取到用户通过路由器传输的数据,如果使用http未经加密,那么黑客可以很轻松的获取用户的信息,甚至是账户信息。

其次,即使使用https,也要在API数据传输设计时,正确的采用加密。例如直接将token信息放在URL中的做法,即使你使用了https,黑客抓不到你具体传输的数据,但是可以抓到你请求的URL啊!(查了资料了,https用GET方式请求,也仅能抓到域名字符部分,不能抓到请求的数据,但是URL可以在浏览器或特殊客户端工具中直接看到。多谢下面的朋友指正错误)因此,使用https进行请求时,要采用POST、PUT或者HEAD的方式传输必要的数据。

现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。实现上,大部分都采用token的认证方式,一般流程是:

然而,此种验证方式存在一个安全性问题:当登录接口被劫持时,黑客就获取到了用户密码和token,后续则可以对该用户做任何事情了。用户只有修改密码才能夺回控制权。

如何优化呢?第一种解决方案是采用HTTPS。HTTPS在HTTP的基础上添加了SSL安全协议,自动对数据进行了压缩加密,在一定程序可以防止监听、防止劫持、防止重发,安全性可以提高很多。不过,SSL也不是绝对安全的,也存在被劫持的可能。另外,服务器对HTTPS的配置相对有点复杂,还需要到CA申请证书,而且一般还是收费的。而且,HTTPS效率也比较低。一般,只有安全要求比较高的系统才会采用HTTPS,比如银行。而大部分对安全要求没那么高的App还是采用HTTP的方式。

我们也给每个端分配一个appKey,比如Android、iOS、微信三端,每个端分别分配一个appKey和一个密钥。没有传appKey的请求将报错,传错了appKey的请求也将报错。这样,安全性方面又加多了一层防御,同时也方便对不同端做一些不同的处理策略。

另外,现在越来越多App取消了密码登录,而采用手机号+短信验证码的登录方式,我在当前的项目中也采用了这种登录方式。这种登录方式有几种好处:

不需要注册,不需要修改密码,也不需要因为忘记密码而重置密码的操作了;

用户不再需要记住密码了,也不怕密码泄露的问题了;

相对于密码登录其安全性明显提高了。

显式用户和隐式用户,我不知道这两个词用的是否确切。 

显式用户指的是,APP程序中有用户系统,一个username、password正确的合法用户,称之为显式的用户,

通常显式用户都需要注册,登录以后能完成一些个人相关的操作。

隐式用户指的是,APP程序本身就没有用户系统,或者一个在没有登录的情况下,使用我们APP的用户。

在这种情况下,可以通过客户端生成的UDID来标识一个用户。

有了用户信息,我们就能够了解不同用户的使用习惯,而不仅仅是全体用户的一个整体的统计信息,

有了这些个体的信息之后,就可以做一些用户分群、个性化推荐之类的事情。

如果是SAAS版本,还需要区分不同商户的用户

接口文档有时候是项目初期就定下来的,前后端开发人员按照接口规范开发,

有的是接口开发完成后写的。

接口文档要清晰、明了,包含多少个接口,每个接口的地址、参数、请求方式、数据交换格式、返回值等都要写清楚。

接口测试程序,有条件的话,也可以提供,方便前后端的调试。

如果是springMVC开发的话,可以用swagger,后端只要加几个注释发一个url给前端就可以了,轻松又高效。

在做PC端网站的时候,我们都会给我们的网站加上个统计功能,要么自己写统计系统,要么使用第三方的比如GA、百度等。

移动端接口API则需要我们自己实现统计功能,

这时就需要我们尽可能多的收集客户端的信息,除了传统的IP、User-Agent之外,还应该收集一些移动相关的信息,

比如

手机操作系统,是android还是ios,都是什么版本,

用户使用的网络状况,是2G、3G、4G还是WIFI

客户端APP是什么版本信息。

这样,有助于我们更好的了解我们用户的使用情况。 关于api 接口设计和API接口设计规范的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 api 接口设计的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于API接口设计规范、api 接口设计的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:api接口使用(API接口)
下一篇:今日头条api接口(今日头条api接口是什么)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~