RESTFul API 基础参考手册

本文深入探讨RESTful API的核心概念,对比REST与SOAP,解析HTTP协议,阐述Spring框架对REST的支持,涵盖RESTful API设计原则,HTTP方法与状态码详解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

REST介绍

REST不是什么

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

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

REST是什么

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

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

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

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

REST中的资源

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

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
AuthorizationHTTP授权的授权证书Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control指定请求和响应遵循的缓存机制Cache-Control: no-cache
Connection表示是否需要持久连接。(HTTP 1.1默认进行持久连接)Connection: close
CookieHTTP请求发送时,会把保存在该请求域名下的所有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发出请求的用户的EmailFrom: 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如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为EtagIf-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-Agent 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对某网络资源的有效的请求行为,不允许则返回405Allow: GET, HEAD
Cache-Control告诉所有的缓存机制是否可以缓存及哪种类型Cache-Control: no-cache
Content-Encodingweb服务器支持的返回内容压缩编码类型。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
Serverweb服务器软件名称Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Set-Cookie设置Http CookieSet-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种:

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

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

HTTP Status Code

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

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

ValueDescription
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状态码:

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

HTTP Content-type

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

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

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

文件扩展名Content-Type(Mime-Type)描述
.pdfapplication/pdfPDF(Portable Document Format的简称,意为“便携式文件格式”)
.jsonapplication/jsonJSON(JavaScript Object Notation)
.jsapplication/javascriptECMAScript/JavaScript(相当于application/ecmascript但是宽松的处理规则)
.xmlapplication/xml可扩展标记语言(英语:eXtensible Markup Language,简称: XML),是一种标记语言。
.zipapplication/zipZIP压缩文件
.gzipapplication/gzipGzip是若干种文件压缩程序的简称,通常指GNU计划的实现,此处的gzip代表GNU zip。
.csvtext/csv逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
.htmltext/html
.mp3audio/mp3
.mp4audio/mp4MP4,全称MPEG-4 Part 14,是一种使用MPEG-4的多媒体计算机文件格式,扩展名为.mp4,以存储数字音频及数字视频为主。
.tifimage/tiff标签图像文件格式(Tagged Image File Format,简写为TIFF)是一种主要用来存储包括照片和艺术图在内的图像的文件格式。它最初由Aldus公司与微软公司一起为PostScript打印开发。
.gifimage/gif图像互换格式(GIF,Graphics Interchange Format)是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像。
.jpegimage/jpegJPEG是一种针对相片图像而广泛使用的一种有损压缩标准方法。
.pngimage/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

代码资源

文章资源

参考资源

转载于:https://juejin.im/post/5cf933645188252c023fa3d9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值