【原创文章,转载请注明原文章地址,谢谢!】

摘要,本文主要是简单讨论RESTful的相关设计问题,包括资源设计,动作设计和响应设计。

资源设计

在本系列第一篇文章中已经通过一个优惠券的例子给大家简单阐述了一下资源的设计,包括二级资源的设计。下面我们来看下详细的资源设计方案:
前面我们已经了解到,在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的”集合”(collection),所以API中的名词也应该使用复数。
例如,针对一个动物园应用,可能涉及到的资源就应该有:
https://api.example.com/v1/zoos:动物园资源
https://api.example.com/v1/animals:动物资源
https://api.example.com/v1/employees:饲养员资源
注意设计的方案,最后一个单词都是名词并且都是复数。对于简单的应用来说,一般一个资源就对应一个表,这样的设计已经足够。但是更多的情况,面对复杂的应用,因为HTTP提供的接口是有限的(HTTP一共就提供了常用的5种请求方式,所以能表示的对一个资源的操作是有限的)怎么抽取出合适的资源,也是一个相对来说比较困难的事情。这个在我们后面的实战示例中会提到。

动作设计

先来看看REST中针对HTTP常用动作的一些固定的含义:

  • GET(SELECT):表示从服务器取出资源(一项或多项)。
  • POST(CREATE):表示在服务器新建一个资源。
  • PUT(UPDATE):表示在服务器更新资源(客户端需要提供改变后的完整资源)。
  • PATCH(UPDATE):表示在服务器更新资源(客户端需要提供改变的属性【可以简单理解为补丁】)。
  • DELETE(DELETE):表示从服务器删除资源。

以上五个是最常用的请求方式;另外还有两个:

  • HEAD:获得一个资源的元数据,比如一个资源的hash值或者最后修改日期;
  • OPTIONS:获得客户针对一个资源能够实施的操作;这个主要是作为Hypermedia 存在(在最佳实践中介绍)

下面列几个简单的动作示例,示例格式 HTTP动作 URL:说明

  • GET /zoos:列出所有动物园
  • POST /zoos:新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息(ID即指定动物园id)
  • PUT /zoos/ID:更新某个指定动物园的信息(浏览器端需要提供该动物园的全部信息)
  • PATCH /zoos/ID:更新某个指定动物园的信息(浏览器端需要提供该动物园的部分信息)
  • DELETE /zoos/ID:删除某个动物园
  • GET /zoos/ID/animals:列出某个指定动物园的所有动物(animals为二级资源路径)
  • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物animals为二级资源路径,前面一个id是指定动物园id,后面一个id是指定动物id)

返回结果

返回结果也是HTTP协议中非常重要的组成部分,客户端完全通过返回结果来断定请求的结果,包括异常等。

返回值类型

即针对不同的请求方式,应该返回什么标准的内容。但是注意,具体返回什么样式的内容,是通过头信息来规定的。下面直接使用一些案例来说明:

  • GET /collection:规定返回资源对象的列表(数组)
  • GET /collection/resource:规定返回单个资源对象
  • POST /collection:规定返回新生成的资源对象
  • PUT /collection/resource:规定返回完整的资源对象
  • PATCH /collection/resource:规定返回完整的资源对象
  • DELETE /collection/resource:规定返回一个空文档

Content Type

一个API可以允许返回JSON,XML甚至HTML等文档格式;具体的文档格式由头信息规定。而头信息来源于两点,一个是请求头中的Accept Type,表示客户端需要请求的表现层数据格式。一个是响应头中的Content Type,表示本次请求服务器端返回的数据格式。

另外,完全也可以通过URI后缀来表示请求格式,比如GET /animals.json用来表示请求json格式的动物列表数据,使用GET /animals.xml来表示请求XML格式的动物列表数据,但是更建议使用请求头来表示,不要把数据类型和资源混淆。

返回状态码

返回状态码在HTTP/1.1协议中是一个非常重要的概念。表示了本次请求的一个最终的效果,也是客户端判定本次请求结果的第一个入口。返回状态码非常多,下面简单列举了常用的返回状态码说明(格式:状态码 状态码说明 适合的请求类型:解释):

  • 200 OK - [GET]:服务器成功返回用户请求的数据。
  • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功(但是大部分情况下,使用200也是可以的)。
  • 202 Accepted - [*]:表示一个请求已经进入后台排队(针对异步请求,或者后台服务需要一定处理时间的请求)
  • 204 NO CONTENT - [DELETE]:用户删除数据成功(但是大部分情况下,使用200也是可以的)。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等(幂等的意思是针对一个数据,多次实施相同的操作效果是一致的。比如多次删除一条数据,最后的效果是一样的,即这条数据被删除,那么删除操作是幂等的,而对于++运算符,每次操作的结果都是在上一次数据值上面加1,所以++操作不是幂等的)的。
  • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
  • 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
  • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
  • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
  • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

小结

在本节中,主要针对RESTful的常见的设计做出了一些解释,到此,关于RESTful的基本概念介绍完毕,要真正的去理解和体会RESTful的好处,还需要在实际的开发中慢慢看。从下一篇文章开始,进入RESTful的开发基础介绍。

Java开发RESTful(三)RESTful设计相关推荐

  1. 在西安学Java开发 这三点学习方法可以借鉴

    很多人都羡慕身边从事Java开发的人,他们的工资轻松超过1万元.他们也有学习Java的想法.然而,西安的Java培训并不容易学习,尤其是很多转学的人都是从零开始学习的.如何在西安学好java开发?结合 ...

  2. 微信小程序拼团(后台java)开发-第一节-产品设计-发起拼团原型和业务简介

    最近准备做一个微信小程序(后台Java支撑)的拼团小项目练练手,微信小程序准备用原生的(不涉及支付环节).之前在公司一直用spring boot ,spring cloud这一套,拼团我想分多个文章来 ...

  3. java开发地三天——数据库介绍

    又是一天萌萌哒地过去了,今天是处理数据库的部分.SQL Server 2008,这东西是上学期搞MFC的时候接触到的,那时候话说安装就是一个大问题,然后在学SQL语句的时候感觉还好,一切都还过得去.现 ...

  4. Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载

    一.本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服,中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多,Maven最终要把资源 ...

  5. java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

    零基础学Java开发技术有哪些优势和好处?Java开发技术有下列优势:Java编程语言简单.面向对象集中于对象及其接口.分布式处理TCP/IP协议.鲁棒性.安全性.体系结构中立性.可移植性.解释执行. ...

  6. 阿里巴巴 Java 开发手册 Java 开发手册(1.0.1)

    一.编程规约 (一) 命名规约 [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ / nam ...

  7. 05_Java筑基之Java开发初体验

    05_Java筑基之Java开发初体验 一. 编写第一个HelloWorld程序 1. Java开发步骤 Java开发需要三个步骤:  也就是会经历如下顺序:  2. 第一步:编写源程序 一开始, ...

  8. Java开发中RestFul服务接口规范

    REST介绍 representational State Transfer (REST) 是一种架构原则,其中将 web 服务视为资源,可以由其 URL 唯一标识.RESTful Web 服务的关键 ...

  9. Java开发西安地区最近面试汇总(三)

    Java开发西安地区最近面试汇总(三) 1.Spring的循环依赖 构造器的循环依赖 案例 结论 属性的循环依赖 案例 结论 Spring内部是在何时完成的属性注入,又是如何解决的循环依赖. 小结 2 ...

最新文章

  1. pox 中 openflow.webservice 组建的学习与使用
  2. python2基本数据类型
  3. JMeter常用组件
  4. jsp中 input placeholder_前端工作中的方法总结
  5. raid5坏了一块盘怎么办_服务器阵列信息丢失,数据怎么办?先不要慌,也许很快就能恢复...
  6. 基于消息队列的分布式事务解决方案
  7. 薛定谔的流量杠杆,网红电商上市的激励与诅咒
  8. leetcode 55. 跳跃游戏 思考分析
  9. 天猫整站SSM-分页-总结(做个人学习笔记整理用)
  10. Linux - xshell上传文件报错乱码
  11. vscode 构建Python ,和C++ 开发环境
  12. php cors和jsonp,jsonp和CORS跨域实现
  13. Visual Studio 2012 更新包2发布,附离线安装方法及下载
  14. 安卓默认下载工具_PanDownload安卓内测版 — 不限速下载工具
  15. 分布式光伏发电系统的组网与研究
  16. 噪音达到多少分贝就算是扰民
  17. 关于MyEclipse的servers和WTPservers
  18. android studio命令行差错,Android Studio构建正常,Gradle命令行失败
  19. java登入ajxs_微信小程序之获取并解密用户数据(获取openid,nickName等)
  20. acwing——844. 走迷宫

热门文章

  1. Easy_language
  2. python去除PDF中印章
  3. 超级计算/先进计算的十大用途
  4. Unity API详解——Application类
  5. NOIP提高组1820~1830集合答案
  6. 用商城维护类项目,讲下应届生如何在面试中介绍项目,如何准备面试
  7. 车辆领域基本知识和定义(入门)
  8. 2019年全国高校计算机能力挑战赛C++组初赛
  9. 电石双向无人值守称重系统功能详解
  10. #2022年合肥市经开区第7届信息学竞赛小学组试题题解#