REST API注意事项

RFC一致性

Methods

GET: 获取某个资源,幂等且无副作用。

POST: 创建一个新的资源。

PUT: 替换某个已有的资源。幂等有副作用。

PATCH: 修改某个已有的资源。

DELETE:删除某个资源。幂等有副作用。

Headers

Accept:服务器需要返回什么样的content。

If-Modified-Since/If-None-Match:如果客户端提供某个条件,那么当这条件满足时,才返回数据,否则返回304 not modified。

If-Match:在对某个资源做PUT/PATCH/DELETE操作时,服务器应该要求客户端提供If-Match头,只有客户端提供的Etag与服务器对应资源的Etag一致,才进行操作,否则返回412 precondition failed。

返回恰当的Status Code

安全性

一致性,机密性,和可用性

请求数据验证

Request headers是否合法:如果出现了某些不该有的头,或者某些必须包含的头没有出现或者内容不合法,根据其错误类型一律返回4xx。
可以在HTTP头中增加X-Request-ID标识调用者身份。
示例:

GET /photos/puppy.jpg HTTP/1.1
X-Request-ID: 1pvs6edg31p92bld853plok8b4

Request URI和Request body是否合法:如果请求带有了不该有的数据,或者某些必须包含的数据没有出现或内容不合法,一律返回4xx。

数据完整性验证

数据完整性验证的底线是:保证要修改的数据和服务器里的数据是一致的 —— 这是通过Etag来完成。
Etag可以认为是某个资源的一个唯一的版本号。当客户端请求某个资源时,该资源的Etag一同被返回,而当客户端需要修改该资源时,需要通过"If-Match"头来提供这个Etag。
服务器检查客户端提供的Etag是否和服务器同一资源的Etag相同,如果相同,才进行修改,否则返回412 precondition failed。

访问控制

REST API需要清晰定义哪些操作能够公开访问,哪些操作需要授权访问。

在HTTP协议之上处理授权有很多方法,如HTTP BASIC Auth,OAuth,HMAC Auth等,其核心思想都是验证某个请求是由一个合法的请求者发起。

HMAC Auth保证一致性:请求的数据在传输过程中未被修改,因此可以安全地用于验证请求的合法性。
HMAC主要在请求头中使用两个字段:Authorization和Date(或X-Auth-Timestamp)。
Authorization字段的内容由":"分隔成两部分,":"前是access-key,":"后是HTTP请求的HMAC值。 在做HMAC的时候,request headers中的request method,request URI,Date/X-Auth-Timestamp等header会被计算在HMAC中。
示例:

GET /photos/puppy.jpg HTTP/1.1
X-Auth-Timestamp: Mon, 26 Mar 2007 19:37:58 +0000
Authorization: AKIAIOSFODNN7EXAMPLE:frJIUN8DYpKDtOLCwo//yllqDzg=

将时间戳计算在HMAC中的好处是可以防止replay攻击。一个请求携带的时间戳,和该请求到达服务器时服务器的时间戳,中间差别太大,超过某个阈值(比如说120s),那么可以认为是replay,服务器主动丢弃该请求。

需要保证传输内容安全,使用HTTPS加密传输。

其他

rate limiting:访问限制。

metrics:服务器应该收集每个请求的访问时间,到达时间,处理时间,latency,便于了解API的性能和客户端的访问分布,以便更好地优化性能和应对突发请求。

docs:丰富的接口文档 —— API的调用者需要详尽的文档来正确调用API,可以用swagger来实现。

hooks/event propogation:其他系统能够比较方便地与该API集成。

参考文章:http://kb.cnblogs.com/page/521718/
作者: programmer_life
时间: 2024-08-27 21:54:25

REST API注意事项的相关文章

CloudStack添加新的API注意事项

1.***Cmd上面的@APICommand里的responseObject关联对于的Response: 2.在tomcatconf/command.properties.in添加新API的权限: 3.为得到Cmd,都需要实现PluggableService接口的getCommands()方法,核心Cmd都需在ManagementServerImpl类的getComands()方法里将新添加的***Cmd类添加到cmList中. CloudStack添加新的API注意事项,码迷,mamicode

百度地图API注意事项

自iOS SDK v2.5.0起,为了对iOS8的定位能力做兼容,做了相应的修改,开发者在使用过程中注意事项如下: 需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription): NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述 NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述 在使用Xcode6进行SDK开发过程中,需

Xamarin迁移到 Unified API 注意事项

参考官方文档: Migrating to Unified API for Components #if __UNIFIED__ ... // Mappings Unified CoreGraphic classes to MonoTouch classes using RectangleF = global::CoreGraphics.CGRect; using SizeF = global::CoreGraphics.CGSize; using PointF = global::CoreGra

百度订单Api注意事项

背景介绍: 申请的百度地图API,采用javascript sdk方式 页面引用 问题1:更换域名导致定位插件不能用 需要修改百度地图-应用中的白名单设置,按照规则添加新的域名 问题2:http与https协议导致的报错 解决方案: 1:程序为http的调用    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=******"></scrip

高德地图API注意事项

注意事项 高德地图采用 GCJ-02 坐标系,即火星坐标系.与 GPS 坐标系,即 WGS-84 坐标系存在一定的偏移量,如果您采集到的坐标数据为GPS坐标,可以先通过AMap.ConvertFrom进行坐标偏移后进行制图或者使用,才能够和高德的底图完全匹配. 经纬度的有效范围为经度-180度到+180度,纬度大约-85度到+85度. 创建地图对象后,开始加载地图资源,地图加载完成后触发complete事件. map.on('complete', function(){ // 地图图块加载完成后

如何接入银联“快速接入”产品API

引言:使用银联开放平台的用户或多或少都接触过产品API吧,那么大家对于“快速接入”产品API是否还会存在一些疑问呢?因为我之前对“快速接入”模糊不清,所以整理的一份详细的资料,里面梳理了“快速接入”产品API的类型,功能特点,如何调用等信息,供大家参考. “快速接入”产品API为银联向外提供统一规范产品API服务的入口,为机构.服务商以及广大开发者统一标准.统一流程的API调用服务.开发者在开放平台创建账号信息.获取产品API调用权限后,可以通过阅读本技术文档来帮助开发.下图为其中一个“快速接入

Android平台第三方应用分享到微信开发

[转载]Android平台第三方应用分享到微信开发 一.申请APPID 微信公共平台和微博分享一样,也需要申请一个ID,来作为调起微信.分享到微信的唯一标识. 申请微信APPID可以到微信平台http://open.weixin.qq.com/app/list/?lang=zh_CN上申请.具体的申请流程网站上有很详细的介绍,我这里就仅列出一些注意事项: (1)申请APPID时的应用名字审核通过之后将不允许更改,所以申请时的应用名字一定要提前确定好.微信官方也有详细说明,如下图: (2)应用签名

Marklogic学习 由浅入深(7)—— Marklogic应用开发指引

前言:在用XQuery语言开发Marklogic应用之前,要对Marklogic有个大致的了解,目前中文材料还不多,我们只能从官网https://docs.marklogic.com 获取相关信息.Marklogic提供了相当多的函数供开发人员使用,这些API的说明都可以在这找到. 说明文档 Guides 进入Marklogic的官网https://docs.marklogic.com/ 这一页有很多项目,默认是文档(Documentation) 选择版本为Marklogic 8,之后所有的讲解

【七牛弯区课堂】Ruby服务间通信模式

Ruby是计算机语言中的绅士,如果要用一个词来形容,那一定是优雅,有这么一位Rubyist,他的座右铭是"写优雅的程序,做一个优雅的人",他是来自七牛小伙伴"薄荷"的Co-founder兼CTO谢文威(英文名Vincent).薄荷的核心系统完全基于Ruby构建,关于Ruby服务间通信模式,他在"七牛弯区课堂"给Ruby爱好者们做了一次分享. 上图是薄荷App服务划分的例子,各子系统(服务)间需要进行各种通信,主要通信种类如下. 一.A服务需要使用