远程调用API

  • 分布式对象(Distributed Objects,简称DO)
    • CORBA/RMI/EJB/DCOM/.NET Remoting
  • 远程过程调用(Remote Procedure Call,简称RPC)
    • SOAP/XML-RPC/JSON-RPC/Hessian/Burlap/Flash AMF/Dubbo RPC
    • 基于Google Protocol Buffer数据交换格式的各种RPC协议
    • 基于Apache Thrift的各种RPC协议,例如唯品会的OSP
  • 表述性状态移交(Representational State Transfer,简称REST)
    • 将HTTP协议真正作为一种 应用协议 来使用,不再需要基于HTTP的各种RPC协议
    • RESTful API——符合REST架构风格要求的API

对于HTTP的常见误解

  • 浏览器只支持GET/POST方法
    • HTML表单仅支持GET/POST方法,但是可以通过附加参数(例如_method)的方式模拟PUT/DELETE请求
    • XMLHttpRequest对象GET/POST/PUT/DELETE 4种方法均可支持
  • 未遵循HTTP协议的指导误用HTTP方法
    • GET方法:安全的、幂等的
    • POST方法:不安全的、不幂等的
    • PUT/DELETE方法:不安全的、幂等的
  • 过度使用GET方法
    • 敏感信息位于URL中,不够安全
    • 容易受到爬虫的伤害
  • 过度使用POST方法
    • 例子:SOAP等RPC风格的调用协议
    • 一个方法承担了过多职责
    • 没有充分利用HTTP的优势
  • HTTP是一种RPC风格的协议
    • 事实:HTTP其实是一种REST风格的协议
    • 统一接口是REST与RPC两种风格协议的主要区别
  • HTTP是一种“传输”协议(transport protocol)
    • 被错误翻译为“超文本传输协议”
    • 事实:HTTP其实是一种“移交”协议(transfer protocol)。TCP才是传输协议,对传输这件工作已经做的很好了。
    • 传输协议和移交协议的区别
      • 传输协议做的是底层搬运比特之类的苦力活,不包含操作的语义
      • 移交协议做的事情比传输协议更高级,包含了操作的语义
  • HTTP不具备互操作性
    • 因此需要在HTTP之上设计SOAP这种“简单”的协议(事实上很复杂)
    • 事实:充分利用好HTTP,已经能够得到足够好的互操作性,在很多场合甚至比使用SOAP更好

对于REST的常见误解

  • REST只适用于面向机器的Web API,不适用于面向人类的Web App
    • 事实:REST在Web上是普遍适用的
  • 直接使用HTTP的API就是RESTful API
    • 事实:在SOAP与真正的RESTful API之间还有广大的中间地带
    • 只达到Richardson成熟度模型第0级的API不是RESTful API
  • REST只不过是更漂亮的URI设计
    • 事实:这仅仅是REST的一个外在特征而已
  • HATEOAS并不重要
    • 事实:这两个方面都是REST架构风格的核心特征
    • 至少需要实现统一接口,否则可以确定是冒牌的RESTful API
  • 统一接口只能使用HTTP实现
    • 事实:HTTP仅仅是实现REST架构风格的一种方式
    • 其他符合REST统一接口的例子:扩展了HTTP协议的WebDAV协议

示例

solr的api设计

1
2
3
4
/select?
/update

/core?

tomcat example的url设计

http://127.0.0.1:8983/solr/admin/form.jsp

bluescan的设计

  • 一点都不restful

  • 资源有什么?manager
    get docs?docid= & userid=
    post docs? //add或者upload操作
    get clauses?docid=
    users, database,

  • 引入delete

问题集

注意区分url设计和api设计。

restful指的api。