现在,大部分主流网站都使用 RESTful 风格的 API 作为交互接口。REST 几乎成了 API 的事实标准,无论是内部 API 还是外部 API。这并不奇怪,因为 REST 的可伸缩性、可扩展性、低耦合等特性无疑是最适合做 Web API 不过了。
虽然各个网站 API 都标榜自己是 REST,但从对 REST 的理解和实践上还有蛮多差别,我个人最欣赏的是Github V3 的设计。
先解释一下 Server-Side API 和 Client-Side API:
上面的功能各异,从关注、发推、评论到统计甚至支付。实现方式各异,从最简单的 JSONP 形式到动态 IFrame,但都把复杂留给了 API 服务提供端,把方便留个了 API 调用者。在处理跨域问题上有很多技术难点,但 Client-Side API 相比 Server-Side API 在给开发者带来的体验是有了质的飞越。
我的观点是,一个和需要用户交互的 API 服务,如果能设计成 Client-Side 就不要设计成 Server-Side 的。
不懂安全的人喜欢把一个东西设计的很麻烦来让人觉得这是安全的,典型的例子是支付宝。
JSONP 作为跨域 Client-Side API 的最主要方式,在传输敏感数据会有 JSONP Leak 漏洞,但是也可以通过 per-sign 的方式避免的。
甚至像 Amazon S3 图片上传这样的功能也可以做成 Client-Side 的,并且很安全。
第三方服务器通过生成一个用 secret key预签名的表单,用户直接从浏览器把图片传到 S3 服务器,S3 服务器成功接收图片之后 callback 给第三方服务器。但是由于 S3 不能在云端对图片进行缩放等处理,遇到需要将一张图片生成不同尺寸图片这种需求会麻烦些。不过七牛做的就比较完美了,不但支持客户端直传图片,而且支持云端图片处理。