RESTFul API 基础参考手册

本文提供了RESTFul API的基础知识,包括RESTFul API的基本概念,HTTP协议相关知识,Spring对REST的支持等。javascript

REST介绍

REST不是什么

以信息为中心的表述性状态转移(Representational State Transfer,REST)已成为替换传统SOAP Web服务的流行方案。他们的主要区别是,SOAP通常会关注行为和处理,而REST关注的是要处理的数据。html

REST不是“基于URL的Web服务”,也不是另外一种类型的远程过程调用(remote procedure call,RPC)机制。RPC是面向服务的,并关注于行为和动做;而REST是面向资源的,强调描述应用程序的事物和名词。java

REST是什么

RE-表述性(Representational):REST资源实际上能够用各类形式来进行表述,包括XML、JSON(JavaScript Object Notation)甚至HTML——最适合资源使用者的任意形式。git

S-状态(State):当使用REST的时候,咱们更关注资源的状态而不是对资源采起的行为。github

T-转移(Transfer):REST涉及到转移资源数据,它以某种表述性形式从一个应用转移到另外一个应用。web

简单来讲,REST就是将资源的状态以最适合客户端或服务端的形式从服务器端转移到客户端(或者反过来)spring

REST中的资源

在REST中,资源经过URL进行识别和定位。至于RESTful URL的结构并无严格的规则,可是URL应该可以识别资源,而不是简单的发一条命令到服务器上。再次强调,关注的核心是事物,而不是行为。json

REST中的资源所指的不是数据,而是数据和表现形式的组合,好比“最新访问的10位会员”和“最活跃的10位会员”在数据上可能有重叠或者彻底相同,而因为他们的表现形式不一样,因此被归为不一样的资源。浏览器

REST中的状态

REST中会有行为,它们是经过HTTP方法来定义的。具体来说,也就是GET、POST、PUT、DELETE、PATCH以及其余的HTTP方法构成了REST中的动做。缓存

这些HTTP方法一般会匹配为以下的CRUD动做:

  • Create:POST
  • Read:GET
  • Update:PUT或PATCH
  • Delete:DELETE

尽管一般来说,HTTP方法会映射为CRUD动做,但这并非严格的限制。有时候,PUT能够用来建立新资源,POST能够用来更新资源。实际上,POST请求非幂等性(non-idempotent)的特色使其成为一个很是灵活的方法,对于没法适应其余HTTP方法语义的操做,它都可以胜任。

REST与HTTP

HTTP Headers

HTTP头信息提供了关于请求,响应或者其余的发送实体的信息。

HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每一个头域由一个域名,冒号(:)和域值三部分组成。

  • 通用头标:便可用于请求,也可用于响应,是做为一个总体而不是特定资源与事务相关联。
  • 请求头标:容许客户端传递关于自身的信息和但愿的响应形式。
  • 响应头标:服务器和于传递自身信息的响应。
  • 实体头标:定义被传送资源的信息。便可用于请求,也可用于响应。

HTTP Request Header

请求头:

Header 解释 示例
Accept 指定客户端可以接收的内容类型 Accept: text/plain, text/html
Accept-Charset 浏览器能够接受的字符编码集。 Accept-Charset: iso-8859-5
Accept-Encoding 指定浏览器能够支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip
Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
Accept-Ranges 能够请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
Authorization HTTP受权的受权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
Connection 表示是否须要持久链接。(HTTP 1.1默认进行持久链接) Connection: close
Cookie HTTP请求发送时,会把保存在该请求域名下的全部cookie值一块儿发送给web服务器 。 Cookie: $Version=1; Skin=new;
Content-Length 请求的内容长度 Content-Length: 348
Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect 请求的特定的服务器行为 Expect: 100-continue
From 发出请求的用户的Email From: user@email.com
Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
If-Match 只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since 若是请求的部分在指定时间以后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match 若是内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range 若是实体未改变,服务器发送客户端丢失的部分,不然发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 只在实体在指定时间以后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards 限制信息经过代理和网关传送的时间 Max-Forwards: 10
Pragma 用来包含实现特定的指令 Pragma: no-cache
Proxy-Authorization 链接到代理的受权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 只请求实体的一部分,指定范围 Range: bytes=500-999
Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer: www.zcmhi.com/archives/71…
TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
Upgrade 向服务器指定某种传输协议以便服务器进行转换(若是支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agen t User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
Via 通知中间网关或代理服务器地址,通讯协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning

HTTP Responses Header

响应头:

Header 解释 示例
Accept-Ranges 代表服务器是否支持指定范围请求及哪一种类型的分段请求 Accept-Ranges: bytes
Age 从原始服务器到代理缓存造成的估算时间(以秒计,非负 ) Age: 12
Allow 对某网络资源的有效的请求行为,不容许则返回405 Allow: GET, HEAD
Cache-Control 告诉全部的缓存机制是否能够缓存及哪一种类型 Cache-Control: no-cache
Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Encoding: gzip
Content-Language 响应体的语言 Content-Language: en,zh
Content-Length 响应体的长度 Content-Length: 348
Content-Location 请求资源可替代的备用的另外一地址 Content-Location: /index.htm
Content-MD5 返回资源的MD5校验值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 在整个返回体中本部分的字节位置 Content-Range: bytes 21010-47021/47022
Content-Type 返回内容的MIME类型 Content-Type: text/html; charset=utf-8
Date 原始服务器消息发出的时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
ETag 请求变量的实体标签的当前值 ETag: “737060cd8c284d8af7ad3082f209582d”
Expires 响应过时的日期和时间 Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified 请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location: www.zcmhi.com/archives/94…
Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方 Pragma: no-cache
Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数 Proxy-Authenticate: Basic
refresh 应用于重定向或一个新的资源被创造,在5秒以后重定向(由网景提出,被大部分浏览器支持) Refresh: 5; url= www.zcmhi.com/archives/94…
Retry-After 若是实体暂时不可取,通知客户端在指定时间以后再次尝试 Retry-After: 120
Server web服务器软件名称 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Set-Cookie 设置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Trailer 指出头域在分块传输编码的尾部存在 Trailer: Max-Forwards
Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked
Vary 告诉下游代理是使用缓存响应仍是从原始服务器请求 Vary: *
Via 告知代理客户端响应是经过哪里发送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 警告实体可能存在的问题 Warning: 199 Miscellaneous warning
WWW-Authenticate 代表客户端请求实体应该使用的受权方案 WWW-Authenticate: Basic

HTTP Request Method

HTTP Request Method共计15种:

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 相似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。
7 OPTIONS 容许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
10 MOVE 请求服务器将指定的页面移至另外一个网络地址。
11 COPY 请求服务器将指定的页面拷贝至另外一个网络地址。
12 LINK 请求服务器创建连接关系。
13 UNLINK 断开连接关系。
14 WRAPPED 容许客户端发送通过封装的请求。
15 Extension-mothed 在不改动协议的前提下,可增长另外的方法。

其中咱们经常使用的POST请求数据被包含在请求体中,POST请求可能会致使新的资源的创建 和/或 已有资源的修改。

HTTP Status Code

HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。

HTTP状态码的第一个数字表明了响应的五种状态之一:

Value Description
1xx: Informational - Request received, continuing process
2xx: Success - The action was successfully received, understood, and accepted
3xx: Redirection - Further action must be taken in order to complete the request
4xx: Client Error - The request contains bad syntax or cannot be fulfilled
5xx: Server Error - The server failed to fulfill an apparently valid request

根据RFC7231规范,目前有如下HTTP状态码:

Value Description
100 Continue
101 Switching Protocols
102 Processing
103 Early Hints
104-199 Unassigned
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
208 Already Reported
209-225 Unassigned
226 IM Used
227-299 Unassigned
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
306 (Unused)
307 Temporary Redirect
308 Permanent Redirect
309-399 Unassigned
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 URI Too Long
415 Unsupported Media Type
416 Range Not Satisfiable
417 Expectation Failed
418-420 Unassigned
421 Misdirected Request
422 Unprocessable Entity
423 Locked
424 Failed Dependency
425 Too Early
426 Upgrade Required
427 Unassigned
428 Precondition Required
429 Too Many Requests
430 Unassigned
431 Request Header Fields Too Large
432-450 Unassigned
451 Unavailable For Legal Reasons
452-499 Unassigned
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected
509 Unassigned
510 Not Extended
511 Network Authentication Required
512-599 Unassigned

HTTP Content-type

Content-Type,内容类型,通常是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。

好比输出图片文件、JSON数据、XML文件等非HTML内容时,就必须用header函数来指定Content-Type,才能达到输出一张图片或是其它指定内容类型的需求。

下面列举一些经常使用的内容类型:

文件扩展名 Content-Type(Mime-Type) 描述
.pdf application/pdf PDF(Portable Document Format的简称,意为“便携式文件格式”)
.json application/json JSON(JavaScript Object Notation)
.js application/javascript ECMAScript/JavaScript(至关于application/ecmascript可是宽松的处理规则)
.xml application/xml 可扩展标记语言(英语:eXtensible Markup Language,简称: XML),是一种标记语言。
.zip application/zip ZIP压缩文件
.gzip application/gzip Gzip是若干种文件压缩程序的简称,一般指GNU计划的实现,此处的gzip表明GNU zip。
.csv text/csv 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,由于分隔字符也能够不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
.html text/html
.mp3 audio/mp3
.mp4 audio/mp4 MP4,全称MPEG-4 Part 14,是一种使用MPEG-4的多媒体计算机文件格式,扩展名为.mp4,以存储数字音频及数字视频为主。
.tif image/tiff 标签图像文件格式(Tagged Image File Format,简写为TIFF)是一种主要用来存储包括照片和艺术图在内的图像的文件格式。它最初由Aldus公司与微软公司一块儿为PostScript打印开发。
.gif image/gif 图像互换格式(GIF,Graphics Interchange Format)是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像。
.jpeg image/jpeg JPEG是一种针对相片图像而普遍使用的一种有损压缩标准方法。
.png image/png 便携式网络图形(Portable Network Graphics,PNG)是一种无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。

REST与Spring

Spring很早就有导出REST资源的需求。Spring对REST的支持是构建在Spring MVC之上的。从3.0版本开始,Spring针对Spring MVC的一些加强功能对REST提供了良好的支持。

Spring4.0 REST特性

4.0版本中,Spring支持如下方式来建立REST资源:

  • 控制器能够处理全部的HTTP方法,包含四个主要的REST方法:GET、PUT、DELETE以及POST。
package org.springframework.web.bind.annotation;
/**
 * Java 5 enumeration of HTTP request methods. 
 * @since 2.5
 */
public enum RequestMethod {
	GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
复制代码
  • Spring 3.2及以上版本还支持PATCH方法。

  • 借助@PathVariable注解,控制器可以处理参数化的URL(将变量输入做为URL的一部分)。

  • 借助Spring的视图和视图解析器,资源可以以多种方式进行表述,包括将模型数据渲染为XML、JSON、Atom以及RSS的View实现。

  • 可使用ContentNegotiatingViewResolver来选择最适合客户端的表述。

  • 借助@ResponseBody注解和各类HttpMethodConverter实现,可以替换基于视图的渲染方式。

  • @RequestBody注解以及HttpMethodConverter实现能够将传入的HTTP数据转化为传入控制器处理方法的Java对象。

  • 借助RestTemplate,Spring应用可以方便地使用REST资源。

  • 经过ResponseEntity对象,能够封装HTTP返回的header、body和statusCode。

Links

代码资源

文章资源

参考资源

Wechat-westcall
相关文章
相关标签/搜索