RESTful
一、RESTful 风格的Web API
REST 即 REpresentational State Transfer,通常被翻译为“表述性状态传输”或者“表述性状态转 移”。实际上是一 个和 HTTP 协议联系非常紧密的一种设计思想、风格。它既不是一种框架,也不是一种标准,只是提供了一组设计原则和约束条件。它代表的是运行在 HTTP 上的一个简单的无状态的架构,每一个唯一 URI 代表一个资源。
- RESTful架构
服务器上每一种资源,比如一个文件,一张图片,一部电影,都有对应的url地址,如果我们的客户端需要对服务器上的这个资源进行操作,就需要通过http协议执行相应的动作来操作它,比如进行获取,更新,删除。
资源与URI
要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI。URI可以看成是资源的地址。
统一资源接口
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。
资源的表述
客户端通过HTTP方法可以获取资源,应该说只是资源的表述而已。 资源在外界的具体呈现,可以有多种表述(或成为表现、表示)形式,在客户端和服务端之间传送的也是资源的表述,而不是资源本身。 例如文本资源可以采用html、xml、json等格式,图片可以使用PNG或JPG展现出来。
客户端如何知道服务端提供哪种表述形式呢? 可以通过HTTP内容协商。客户端可以通过Accept头请求一种特定格式的表述,服务端则通过Content-Type告诉客户端资源的表述形式。
状态的转移
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的资源状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
总结一下什么是RESTful架构:
1) 每一个URI代表一种资源;
2) 客户端和服务器之间,传递这种资源的某种表现层;
3) 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
- 2. RESTful API
RESTful API(应用程序接口)是符合RESTful规范的框架,用它可以实现跨平台、广泛覆盖客户端(包括浏览器和移动设备)的HTTP服务。大多数网站提供API,以便开发人员可以在其上进行扩展开发,二次开发等
在创建 RESTful 服务时,应遵循四个基本的设计原则:
1) 使用HTTP方法(动词)描述操作,使用统一的方式来获取资源(交互的统一接口,URI定位资源),即检索资源使用GET,创建资源使用POST,更新资源使用PUT / PATCH,删除资源使用DELETE。
2) 与资源的交互是无状态的, 因此由客户端发起的每个请求应当包括HTTP请求的所有参数,上下文信息和所需服务器返回数据数据类型等。
3) 资源标识应通过URI来定义,简单来说应该是只使用URI来完成服务器与客户端和资源之间的交互。这些URI可以看作一个RESTful服务提供的接口。
4) 支持JSON或XML等多种格式作为数据传输格式。
二、构建REST风格的API
- 1. API版本可以放在URL或者HTTP的Header里
http://example.com/api/v1/
http://api.example.com/v1/
- 2. URL使用名词而非动词
http://example.com/api/v1/getNews 这是一个糟糕的设计
GET: http://example.com/api/v1/News 这是一个优雅的设计
- 3. 返回值类型使用IHttpActionResult--统一的返回数据类型
public IHttpActionResult Delete(int id)
{
return Ok();
}
IHttpActionResult是WebApi最常用的一种返回值类型,常用的方式有:Json(T content)、Ok()、 Ok(T content)、NotFound()、Content(HttpStatusCode statusCode, T value)、BadRequest()、Redirect(string location)、StatusCode(HttpStatusCode statusCode)等
l 返回 Json(T content),返回的是JsonResult对象,如return Json<List<userinfo>>(list);;也可以使用dynamic来返回一个对象,如:return Json<dynamic>(new { AA = "a", BB = "b" });
l 如果返回Ok(),就表示不向客户端返回任何信息,只告诉客户端请求成功,如return Ok();;Ok(T content)向客户端返回一个成功的对象,如:return Ok(result);。
l NotFound()方法会返回一个404的错误到客户端,如:return NotFound();
l Content(HttpStatusCode statusCode, T value),向客户端返回值和http状态码,如:return Content<string>(HttpStatusCode.OK, "OK");。
l BadRequest() 向客户端返回400的http错误,如:return BadRequest();
l Redirect(string location) 将请求重定向到其他地方,如:
return Redirect("http://localhost:7408/api/Values/getJson1");
l StatusCode(HttpStatusCode statusCode):方法中传入一个HttpStatusCode枚举类型,这里面提供HTTP协议所有的状态码。
常见状态码
200 请求已成功
400 语义有误,当前请求无法被服务器理解;请求参数有误
403 服务器已经理解请求,但是拒绝执行它
404 请求失败,请求所希望得到的资源未被在服务器上发现
408 请求超时
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理
- 4. 使用正确的HTTP状态码表示访问状态
l 状态码200 用户请求Web API接口已成功,可以返回Ok()或Ok(result);
l 状态码404,用户请求Web API接口失败,请求所希望得到的资源未被在服务器上发现,可以返回NotFound();
l 状态码400,用户请求Web API接口数据格式或类型有误可以返回BadRequest()
l 还可以返回更多情况状态码,在StatusCode()方法中传入一个HttpStatusCode枚举类型,这里面提供HTTP协议所有的状态码,如: return StatusCode(HttpStatusCode.NotFound);
注意:创建的控制器类型请选择“Web API2控制器-空。因为Web API控制器继承的是ApiController,MVC控制器继承的是Controller
三、Web API测试
Web API接口开发过程中,需要一个功能完善的工具帮助我们完成接口的调试——Postman。
使用Postman进行Web API的测试时必须先运行服务器
Postman基本使用
1、下载安装
2、创建基本请求(Request)
1) 创建请求的名称。
2)
设置请求的保存路径。
3、在工作区选择选项卡
1) 设置请求类型
2) 填写web API地址
3) 如果有参数则填写Params参数,如果没有则不用理会
4) 如果请求是POST\PUT类型则选择Body,填写参数
5) 选择send发起请求(Web API服务器必须正在运行)
6) 查看请求结果
测试查询所有学生
测试添加学生
测试更新学生信息