前后端接口规范---关键点1
2016-12-10 10:01
489 查看
关于REST 前后端接口按照粗浅的REST规则制定,其主要表现为: 使用GET、POST、PUT、DELETE共4个HTTP Method,而非简单的GET和POST两者。 响应使用HTTP状态码来标志请求的执行结果,而非以往的success字段。 URL符合业界普遍接受的REST规则,减少在URL中标识操作类型的情况,如使用POST /users代替POST /users/save。 出于技术的限制,对于一些特殊的场景,接口会在REST设计的基础之上进行一些妥协,具体参考各接口规范说明。 在REST接口规范中,URL符合以下约束: 实体名称均以复数形式表示,如GET /users或POST /users/status。 URL最后 不得 添加斜杠/符号。 对于GET请求,数据在URL后通过标准的query格式提供,如GET /users?status=1,2&keyword=hello。 对于各系统,可以在URL前统一添加固定的前缀,如GET /api/{entities}/{id},前缀应尽量固定。可以根据请求的类型(如是否需要用户登录授权等)使用不同的前缀。规范推荐按以下规则使用前缀: 如果是需要登录授权的接口,以/api/js为前缀。 其它接口,通常没有权限控制,以/api/tool为前缀。 关于数据类型 请求可以使用以下两类数据类型,由具体的项目及接口根据实际情况决定: 表单编码格式。此格式为简单的a=b&c=d这一形式,使用此请求格式时,请求的Content-Type头的值必须为application/x-www-form-urlencoded。 JSON格式。此格式为一个完整的符合JSON格式的串,使用此请求格式时,请求的Content-Type头的值必须为application/json。 响应可以使用以下几类数据类型: JSON格式。多数接口应当使用JSON格式的响应,此时响应的Content-Type头的值必须为application/json。 HTML格式。部分接口,如文件上传,由于技术的限制必须使用<iframe>元素完成,返回的响应为一个HTML片段,此时响应的Content-Type头的值必须为text/html,且响应状态码必须为200,具体可参考下文的文件上传相关接口规范。 JSONP格式。当跨系统调用API时,会需要使用JSONP接口,此时响应的Content-Type头的值必须为application/x-javascript,使用请求的URL中的callback字段的值为函数名返回相应的JSONP片段。 关于编码 所有请求和响应均 必须 使用utf-8为编码。此标准体现在请求和响应的Content-Type头的值后必须配有;charset=utf-8字样。 对于前端使用JSONP的场景,则应当为<script>标签添加charset="utf-8"属性。 关于CSRF 系统必须对CSRF(客户端伪造请求)具有防御能力,因此在系统中,必须加上CSRF Token。 CSRF Token在用户登录后,第一次加载用户信息时,由后端提供,其值为一个任意字符串。 CSRF Token应当被应用在所有对数据有影响的接口中,包括所有的POST、PUT和DELETE请求;对于GET请求由于通常不影响数据,不会造成破坏性的后果,建议不使用CSRF Token。 在需要CSRF Token的每一个AJAX请求中,客户端必须添加名为X-Session-Token的请求头,其值为后端提供的CSRF Token。如果不提供X-Session-Token请求头,则后端应当返回400状态码。 对于非AJAX的请求,如文件上传,则应当在POST请求的表单中添加sessionToken字段,其值为后端给出的CSRF Token。 根据业务的需要和技术的限制,后端可对部分接口添加白名单,以使接口不需要CSRF Token即可请求,这通常用于获取当前用户信息前就必须请求的接口,由于此时前端不能获取CSRF Token,因此此类接口必须在白名单中,以确保系统可用。 关于超时 系统的AJAX请求必须配有超时时间,具体时间可根据系统部署环境、网络状况、请求响应大小等因素决定,标准给出的参考值为15秒。 关于缓存 REST设计的一个原则为有效利用缓存,因此接口的设计 必须 将缓存作为一个因素,进行认真的设计并写入接口文档。 所有POST、PUT和DELETE请求均不缓存,这一点由浏览器自身保证,无需额外的配置。 对于GET请求,必须合理地配置缓存头,标准建议使用以下方式实现缓存: 如果资源是实时变化无法缓存的,则请求时带时间戳字段,时间戳字段的参数名为_,后端应当忽略此字段。同时无缓存的GET请求,响应中应当有Cache-Control: no-cache头,且 不得 含有ETag和Last-Modified头,如果包含Expires头,则其值必须为一个过去的时间。 如果资源带有最后修改时间(如数据库中有last_update_time列),则建议将此时间作为响应的Last-Modified头返回,前端 不对 该请求添加时间戳,以实现正确的缓存。当可以生成Last-Modified头时,不建议同时生成ETag头。 如果资源带有一个唯一的版本标识(如数据库中有rowid列),则建议将此标识值作为响应的ETag头返回,前端 不对 该请求添加时间戳,以实现正确的缓存。当可以生成ETag头时,不建议同时生成Last-Modified头,两者以Last-Modified头为优先。 如果一个资源可以有假定的缓存时间,则通过Cache-Control: max-age={seconds}或Expires响应头进行配置。标准建议使用此类缓存时慎重考虑,在请求不是系统性能瓶颈时,不建议使用此类缓存。 关于接口文档 接口文档应当 至少 包含以下内容: 接口的名称及简单的作用描述。 接口的URL和请求时使用的HTTP Method。 接口的请求格式及参数。 接口可能返回的状态码,及每个状态码下的响应类型和格式。 接口的缓存设计。 以下为一个典型的接口文档: ## 用户列表 用于获取用户列表,带分页功能 ## 接口: GET /users ## 请求参数: | 名称 | 类型 | 定义 | 必需 | 默认值 | 说明 | keyword | string | 查询关键词 | | "" | 作用于name和id字段 | page | number | 页码 | | 1 | | role | number | 角色 | | 全部 | 参考角色枚举说明 | orderBy | string | 排序字段名称 | | "id" | 可以使用"id"或"name" | order | string | 排序方式 | | "asc" | 可以为"asc"或"desc" ## 响应: ### 成功:200 响应格式:JSON { totalCount: {number}, // 总数 results: [ { "id": {number}, "name": {string}, "role": [{number}, ...], // 角色,多个角色用数组表示 "birthday": {string}, // 生日使用YYYYMMDD格式 }, ... ] } 缓存配置:使用`ETag`进行缓存。 ### 参数不合法:409 参考标准409响应 在文档中,对于一些整个项目统一的内容,如页码默认值为1之类,可以省略说明,在单独的总体设计文档中标注即可。
相关文章推荐
- 前后端接口规范----获取用户信息2---常用接口4
- 前后端接口规范-------实体定义2
- 前后端接口规范-------通用响应格式3
- 前后端接口规范----获取用户登录状态1---常用接口4
- 前后端接口文档规范模板
- 应用集成实战系列:服务总线中同步交互服务接口的定义规范
- sqlite3 遵循Python PDB-API 2.0 接口规范的SQLite库(1)
- API接口规范完整版本(续) · Issue #129 · mishe/blog
- 电信综合管理平台isag接口规范.
- 接口的规范
- 某小公司RESTful、共用接口、前后端分离、接口约定的实践
- 接口测试【前段与后端】
- Java语言规范第九/十章-接口/数组
- RESTful API实战笔记(接口设计及Java后端实现)
- MATLAB中mexFunction函数的接口规范
- 规范接口
- 前端与后端的交互(定义接口)
- 工具接口标准(TIS)可执行链接格式(ELF)规范-卷III-操作系统特性(Operating System Specific)-对象文件
- jvm规范规定的对类(或者接口)初始化的情况
- 接口规范 13. 文件上传及管理相关接口