原文:http://reynders.co/how-restful-is-your-service/
发表于:2013年9月

如今无论是社交媒体平台还是企业解决方案,Web services都不出不在。为了可以跨平台使用,如何“暴露”你的APIs就显得非常重要。当前,很多APIs表面上声称是RESTful,但实际上它们是改进过后的RPC。

许多声称实现了REST风格的服务甚至不知道这个词是什么意思,因此我来解释一下什么是REST,并且告诉你如何RESTful你的服务。

REST and RESTful

Roy Fielding 的定义, Representational State Transfer(REST) 是分布式系统的一种软件架构风格。例如Web,它依赖于一个无状态(stateless),客户端-服务器(client-server),可缓存的(cache-able)通信协议,比如HTTP。

/this/does/not/mean/restful, { "neither":"does this" }
 

拥有清晰流畅的路由并且返回JSON数据并不意味你的服务已经RESTful。只有当采用REST风格并且遵循某些规则时才是真正的RESTful服务。

Fielding指出RESTful所需的6个约束,其中至少5个需被重视:

1. 客户端-服务器约束(Client-Server constraint) 

使用统一接口隔离客户端与服务器。客户端不必关心业务逻辑和数据存储,同样的,服务器不必考虑用户界面。

2. 无状态约束(Stateless constraint)

每次请求都包含服务器所需的所有信息,服务器没有存储状态信息。

3. 可缓存约束(Cache-able constraint)

服务器响应必须能够显式或隐式定义自己是可缓存的(cache-able),允许客户端复用响应,减少与服务器之间的频繁调用,以此来提升性能。

4. 分层系统约束(Layered System constraint) 

客户端无需考虑中介组件,如负载平衡和代理,提高系统的可伸缩性。

5. 统一接口约束(Uniform Interface constraint)

客户端与服务器之间使用统一的基于HTTP协议的URI来定位资源。如前所述,每个信息都包含足够服务器完成后续处理的信息,既 HATEOAS(Hypermedia As The Engine Of Application State)。

6. 按需代码约束(Code On Demand constraint)

可选约束。在服务器返回信息之前,客户端无需知道如何处理这些信息。通常用于向已完成部署的系统中添加功能。

RESTful Web APIs
 

实现REST的Web应用程序接口和基于HTTP实现RESTful的Web APIs包含以下特性:

  • 基本URI,例如:http://api.mysystem.com
  • 支持互联网媒体类型,如:JSON
  • 使用HTTP动词(HTTP verbs: GET, POST, PUT, DELETE)完成操作
  • 超文本驱动(Hypertext driven)

RESTful Web API 必须易于使用并且提供完整的帮助文档。

"If you have to ship an SDK for your RESTful API, it is not a RESTful API" - source

ASP.NET开发团队提供了一个基于REST原则构建Web API的开发框架,叫做 ASP.NET Web API,点击获得扩展阅读

小记

前述“约束”并不是一个标准,但不失为构建RESTful风格Web应用的最佳指引。

目前真正实现RESTful思想的应用屈指可数,大部分还是基于HTTP协议改进的RPC。下次你在研究一个新的API时,可以体会一下是否是真正的RESTful。

如何 RESTFul 你的服务(译)的更多相关文章

  1. WCF Restful Service的服务

    构建基于WCF Restful Service的服务 前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面 ...

  2. java 利用HttpURLConnection方式获取restful格式的服务数据

    /** * @Author: * @Description:利用HttpURLConnection方式获取restful格式的服务数据 * @Date: */ private static List& ...

  3. 构建基于WCF Restful Service的服务

    前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面的Dynamic Proxy,但是没有这种方式简便), ...

  4. RESTFul Web Api 服务框架(一)

    简介: 基于 REST 的 Web 服务日益成为后端企业服务集成的首选,因为它比 SOAP 更加简单.这篇文章介绍了一 个简单的可扩展框架,使用Asp.net Web Api作为 REST 服务的实现 ...

  5. Python Tornado搭建高并发Restful API接口服务

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快能实现高并发.得利于其 非阻塞的方式和对epoll的运用,Torn ...

  6. 消费Restful的web服务(三)

    构架工程 创建一个springboot工程,去消费RESTFUL的服务.这个服务是 http:///gturnquist-quoters.cfapps.io/api/random ,它会随机返回Jso ...

  7. [转]构建基于WCF Restful Service的服务

    本文转自:http://www.cnblogs.com/scy251147/p/3566638.html 前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添 ...

  8. springMVC+json构建restful风格的服务

    首先.要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描写叙述了一个架构样式的网络系统.比方 web 应 ...

  9. Spring Boot教程(三)消费Restful的web服务

    构架工程 创建一个springboot工程,去消费RESTFUL的服务.这个服务是 http:///gturnquist-quoters.cfapps.io/api/random ,它会随机返回Jso ...

随机推荐

  1. echarts断点连线问题 终级

    /** * * 测试关系图 graph type* */var coors1 = [['1', 0],['2', 182],['5', 290],['6', 330],['7', 310],['10' ...

  2. lnmp的安装--php

    1.下载php源码 wget http://cn2.php.net/distributions/php-5.6.3.tar.gz tar zxvf php-5.6.3.tar.gz cd php-5. ...

  3. 数据库SQL调优之"执行计划"【未完待续】

    什么是“执行计划”?“执行计划”怎么用于SQL调优? 内容待添加... 参考文章: [1]写SQL要学会使用"执行计划" by 鹏霄万里展雄飞      

  4. 事务时间如何去掉wasted time

    事务时间如何去掉wasted time   事务时间 一个事务的时间是指持续时间,事务会完全记录下从事务开始到事务结束之间的时间差,那么事务的时间能真实地反映业务操作的时间吗?不能,就好像人用手按秒表 ...

  5. nginx实现正向代理和反向代理

    注意:nginx正向代理有缺陷,如果同时实现http和https正向代理请使用squid软件 (1)正反向代理 正向代理:实现客户端上网 反向代理:代理访问后端web服务器, 区别:正向代理的对象是客 ...

  6. python的ipython manage.py shell 引发的 No module named _argparse

    环境是:Centos6.6 ,python 2.6 今晚,shell 中输入: # ipython manage.py shell 报错,说找不到命令: 我当时,觉得,我有可能没有安装ipython ...

  7. Storm基本概念以及Topology的并发度

    Spouts,流的源头 Spout是Storm里面特有的名词,Stream的源头,通常是从外部数据源读取tuples,并emit到topology Spout可以同时emit多个tupic strea ...

  8. Luogu P2016 战略游戏(树形DP)

    题解 设\(f[u][0/1/2]\)表示当前节点\(u\),放或不放(\(0/1\))时其子树满足题目要求的最小代价,\(2\)表示\(0/1\)中的最小值. 则有: \[ f[u][0]=\sum ...

  9. Luogu P2146 软件包管理器(树链剖分+线段树)

    题意 给定\(n\)个软件包,每个软件包都有一个依赖软件包,安装一个软件包必须安装他的依赖软件包,卸载一个软件包必须先卸载所有依赖于它的软件包.给定\(m\)此操作,每次一个操作\(install/u ...

  10. Mysql远程连接报错:SQL Error (1130): Host '192.168.6.128' is not allowed to connect to this MySQL server

    通过SQLyog连接linux中的MySQL报错问题:SQL Error (1130): Host '192.168.6.128' is not allowed to connect to this ...