# 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的图书列表。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

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