# JAVA RESTful WebService实战笔记(一)

PUT方法

PUT方法是一种写操作的HTTP请求,REST使用HTTP的PUT方法更新或添加资源

1、更新资源

REST知识风格,不是技术规范或者标准,所以有些实现REST的细节明确的定义,这对实践而言,不可避免会产生某些误解,比如在创建和更新某个资源的时候,开发者比较迷茫的是何时该用HTTP的PUT方法,何时使用POST方法,为了解决这一问题,我们首先应该知道PUT方法的特性,PUT方法是幂等的,即多次插入或者更新同一份数据,在服务器端对资源状态所产生的改变是相同的,PUT方法是不安全的,有些动作的HTTP方法都不是安全的。我们知道,由于使用同一份数据向服务器请求更新某一资源,得到的结果应该总是相同的,因此对于更新操作,使用PUT是没有疑问的。

2、添加资源

创建操作通常每次得到的结果是不同的,因为服务器端的业务层逻辑通常要求数据的主键字段要么来自于业务平台自增一个逻辑值,要么来自于数据库中的主键自增,因此,相同的数据每一次提交到服务器端,都会为数据添加一个新的主键值,也就是创建一个主键值不同的新资源(如果没有业务或者外键冲突)。所以,创建操作通常应当设计为POST方法的API,唯有一种场景应当使用PUT方法来设计API,即客户端在发起创建请求时候,在同一份数据中总可以提供唯一的主键值,服务器不会对其进行修改,这样的创建请求确保了幂等性,不应该在使用PUT请求


资源地址设计

资源地址的设计对整个REST式的Web服务至关重要,设计系统的可用性和可扩展性等诸多方面的表现

1、资源路径概览

元素 描述
sehema 协议名称,通常是HTTP或者HTTPS
host (DNS)主机名称或者IP地址
port 服务端口
path 资源地址,使用"/"符号来分隔逻辑上的层次结构
? 用来分隔资源地址和查询字符串符号
queryString 查询字符串,方法作用域信息
使用“&”符号来分隔查询条件
使用都好分隔有次序的作用域信息
使用分号分隔无次序的作用域信息

资源地址的路径变量使用来表达逻辑上的层次结构的,资源和子资源的高兴事是自左向右、斜杠分隔的名词。他们的关系可以是从整体到局部,比如学校到班级,城市到乡村.可以是从一般到具体,比如一个生物的“门”、“纲”、“目”、“科”等。。。的资源路径,资源地址具体的可以分为5个部分,以sehema://host:port/path?queryString为例,如下表格

元素 描述
sehema 协议名称,通常是HTTP或者HTTPS
host (DNS)主机名称或者IP地址
port 服务端口
path 资源地址,使用"/"符号来分隔逻辑上的层次结构
? 用来分隔资源地址和查询字符串符号
queryString 查询字符串,方法作用域信息
使用“&”符号来分隔查询条件
使用都好分隔有次序的作用域信息
使用分号分隔无次序的作用域信息

一个典型的URI如上表所示,包括协议名称、主机名称、服务端口、资源地址和查询字符串5个部分,其中资源地址部分,根据具体部署的不同或有差别
http://localhost:8080/simple-service-webapp-spring-jpa-jquery/webapi/books/book?id=1

通常使用ContextPath、ServletPaht和PathInfo来细分资源地址。

  • ContextPath: 上下文名称,通常和部署服务器的配置或者REST服务的web.xml配置有关。
  • ServletPath: 是Servlet的名称,与REST服务中定义的@ApplicationPath注解或者web.xml的而配置有关

JAX-RS2定义了@Path注解来定义资源地址

  • PathInfo:资源路径信息,与资源类、子类及勒种的方法蒂尼的@Path注解有关

2、资源地址和作用域

功能 资源地址
添加/创建 POST/books
PUT/books/{id}
删除 DELETE/books/{id}
修改/更新 PUT/books/{id}
查询全部 GET/books HTTP1.1
主键查询 GET/books/{id} HTTP1.1
GET /books?id=12334
分页作用域查询 GET/books/{id} HTTP1.1
GET /books/01,2002-12,2014
GET /books/restful;program=java;type=web
GET /books?limit=100&sort=bookname

在路径变量里面可以使用标点符号以辅助增强逻辑清晰性。如下表所示

功能 资源地址
添加/创建 POST/books
PUT/books/{id}
删除 DELETE/books/{id}
修改/更新 PUT/books/{id}
查询全部 GET/books HTTP1.1
主键查询 GET/books/{id} HTTP1.1
GET /books?id=12334
分页作用域查询 GET/books/{id} HTTP1.1
GET /books/01,2002-12,2014
GET /books/restful;program=java;type=web
GET /books?limit=100&sort=bookname
  • 问号(?) 是用来分隔资源路径地址和查询字符串,与符号(&)是用来分隔查询条件的参数,示例代码如下
GET /books?start=0&size=19

代码解释:开始行参数为0,查询的条目是19,及从第0行开始查询去19条数据

  • 逗号(,)是用来分隔有次序的作用域信息,需要注意的是逗号分隔符的逻辑上的顺序信息,这种顺序可以是约定俗成的,比如先写经度然后纬度;也可以是系统约定的,比如年、月、日、时等。
    举例来说:按时间区域查询图书,日期信息在资源地址中是采用月、年顺序,代码如下
GET /books/01,2002-12,2014

代码解释:查询2002年1月到2014年12月的这个时间段的图书,这个例子中还使用到了连字符(-),有时候也可以使用下划线(_)来做逻辑上的辅助分隔。

  • 分号(;)是用来分隔无次序的作用域信息,通常这些信息是逻辑上并列存在的,比如并列的查询条件,示例代码如下
GET /books/restful;program=java;type=web

代码解释:查询满足图书内容为restful的,石宏的编程语言是java的讲述的类型是web的图书列表。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,771评论 19 139
  • 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如...
    时待吾阅读 8,783评论 0 19
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,107评论 6 342
  • 我既不想嫁给左先生,也不想嫁给右先生 文/暗香清影 最近被刷爆朋友圈的是老梗左先生右先生,究竟嫁给谁...
    暗香屋阅读 2,435评论 0 3
  • 小动画里的大世界 一直以来,动画片都是孩子们的专利,可最近几年动画片的制作越来越精良,所探讨的故事主题越来越广泛,...
    杨明洁阅读 1,833评论 0 0