REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等广泛流行的标准和协议;轻量级,跨平台,跨语言的架构设计;它是一种设计风格,不是一种标准,是一种思想

Rest架构的主要原则

网络上的所有事物都被抽象为资源

每个资源都有一个唯一的资源标识符

同一个资源具有多种表现形式(xml,json等)

对资源的各种操作不会改变资源标识符

所有的操作都是无状态的

符合REST原则的架构方式即可称为RESTful

什么是Restful:

对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构).

为什么会出现Restful

在Restful之前的操作:
http://127.0.0.1/user/query/1 GET  根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息

RESTful用法:
http://127.0.0.1/user/1 GET  根据用户id查询用户数据
http://127.0.0.1/user  POST 新增用户
http://127.0.0.1/user  PUT 修改用户信息
http://127.0.0.1/user  DELETE 删除用户信息

之前的操作是没有问题的,大神认为是有问题的,有什么问题呢?你每次请求的接口或者地址,都在做描述,例如查询的时候用了query,新增的时候用了save,其实完全没有这个必要,我使用了get请求,就是查询.使用post请求,就是新增的请求,我的意图很明显,完全没有必要做描述,这就是为什么有了restful.

如何使用:

SpringMVC实现restful服务:

SpringMVC原生态的支持了REST风格的架构设计

所涉及到的注解:

--@RequestMapping

---@PathVariable

---@ResponseBody

HTTP相应状态码:

  1. package cn.itcast.mybatis.controller;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.HttpStatus;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestMethod;
  10. import org.springframework.web.bind.annotation.RequestParam;
  11. import org.springframework.web.bind.annotation.ResponseBody;
  12.  
  13. import cn.itcast.mybatis.pojo.User;
  14. import cn.itcast.mybatis.service.NewUserService;
  15.  
  16. @RequestMapping("restful/user")
  17. @Controller
  18. public class RestUserController {
  19.  
  20. @Autowired
  21. private NewUserService newUserService;
  22.  
  23. /**
  24. * 根据用户id查询用户数据
  25. *
  26. * @param id
  27. * @return
  28. */
  29. @RequestMapping(value = "{id}", method = RequestMethod.GET)
  30. @ResponseBody
  31. public ResponseEntity<User> queryUserById(@PathVariable("id") Long id) {
  32. try {
  33. User user = this.newUserService.queryUserById(id);
  34. if (null == user) {
  35. // 资源不存在,响应404
  36. return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
  37. }
  38. // 200
  39. // return ResponseEntity.status(HttpStatus.OK).body(user);
  40. return ResponseEntity.ok(user);
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. //
  45. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
  46. }
  47.  
  48. /**
  49. * 新增用户
  50. *
  51. * @param user
  52. * @return
  53. */
  54. @RequestMapping(method = RequestMethod.POST)
  55. public ResponseEntity<Void> saveUser(User user) {
  56. try {
  57. this.newUserService.saveUser(user);
  58. return ResponseEntity.status(HttpStatus.CREATED).build();
  59. } catch (Exception e) {
  60. // TODO Auto-generated catch block
  61. e.printStackTrace();
  62. }
  63. //
  64. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
  65. }
  66.  
  67. /**
  68. * 更新用户资源
  69. *
  70. * @param user
  71. * @return
  72. */
  73. @RequestMapping(method = RequestMethod.PUT)
  74. public ResponseEntity<Void> updateUser(User user) {
  75. try {
  76. this.newUserService.updateUser(user);
  77. return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. //
  82. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
  83. }
  84.  
  85. /**
  86. * 删除用户资源
  87. *
  88. * @param user
  89. * @return
  90. */
  91. @RequestMapping(method = RequestMethod.DELETE)
  92. public ResponseEntity<Void> deleteUser(@RequestParam(value = "id", defaultValue = "0") Long id) {
  93. try {
  94. if (id.intValue() == 0) {
  95. // 请求参数有误
  96. return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
  97. }
  98. this.newUserService.deleteUserById(id);
  99. //
  100. return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. //
  105. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
  106. }
  107. }

总结:

restful就是旧技术,新风格.

【Restful】三分钟彻底了解Restful最佳实践的更多相关文章

  1. Spring RESTful服务接收和返回JSON最佳实践

    http://blog.csdn.net/prince_hua/article/details/12103501

  2. 给HTML初学者的三十条最佳实践

    Nettuts +运营最困难的方面是为很多技能水平不同的用户提供服务.如果我们发布太多高级教程,我的新手用户将无法从中受益.相反也是如此.我们尽我们最大的努力,但如果你觉得你被忽略了请联系我们.这个网 ...

  3. RESTful服务最佳实践

    本文主要读者 引言 REST是什么 统一接口 基于资源 通过表征来操作资源 自描述的信息 超媒体即应用状态引擎(HATEOAS) 无状态 可缓存 C-S架构 分层系统 按需编码(可选) REST快速提 ...

  4. 001-RESTful服务最佳实践-RestFul准则、HTTP动词表示含义、合理的资源命名、响应格式XML和JSON

    一.概述 因为REST是一种架构风格而不是严格的标准,所以它可以灵活地实现.由于这种灵活性和结构自由度,对设计最佳实践也有很大的差异. API的方向是从应用程序开发人员的角度考虑设计选择. 幂等性 不 ...

  5. RESTful服务最佳实践(转)

    原文:https://www.cnblogs.com/jaxu/p/7908111.html 译文作者:Jaxu 英文原文:https://files-cdn.cnblogs.com/files/ja ...

  6. RESTful API 设计最佳实践

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...

  7. ****RESTful API 设计最佳实践(APP后端API设计参考典范)

    http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...

  8. RESTful API 设计最佳实践(转)

    摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...

  9. RESTful API 设计最佳实践(转)

    背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...

随机推荐

  1. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  2. 字典(Dictionary)

    字典(Dictionary) 字典是一种可变的容器模型,由键值对组成,键和值用冒号分隔,用花括号括起来: d = {key1 : value1, key2 : value} 字典的值可以是任何类型的数 ...

  3. 如何创建带有大纲和书签的交互式web报表

    交互式报表允许用户与之交互.例如,报表可以包含超链接.书签和大纲.通过点击大纲部分的标题,你可以将书签导航到报表中的所需位置.这样的报表经常用在产品目录中.(查看更多web报表教程) 让我们为Web创 ...

  4. Http请求中 content-type 和 dataType 区别

    contentType: 告诉服务器,我要发什么类型的数据 dataType:告诉服务器,我要想什么类型的数据,如果没有指定,那么会自动推断是返回 XML,还是JSON,还是script,还是Stri ...

  5. Linux 流量控制总结(TC)

    TC对带宽的描述:    mbps = 1024 kbps = 1024 * 1024 bps => byte/s    mbit = 1024 kbit => kilo bit/s.   ...

  6. Database学习 - mysql数据类型

    MySQL数据类型 可以被分为3类: 1.整型,数值类型 2.日期和时间类型 3.字符串(字符)类型 整型(INT) 数据类型 大小 M(默认值) 范围(有符号) 范围(无符号) 用途 tinyint ...

  7. jquery选择器最后一个,倒数第二个元素

    <div> <p>1</p> <p>2</p> <p>3</p> <p>4</p> < ...

  8. 教你如何使用android studio发布release 版本【转】

    原文链接 想必还有人对如何在Android studio (以下简称as)发布release版本的app而狂刷百度吧?都是过来人,我很理解这种心情,百度到的基本是半成品,为什么这么说呢?百度一下,你就 ...

  9. jquery菜单插件

    原理很简单. 涉及到知识点: 1.jquery的position注意这里是jquery的position,不是css的position offset的概念 2.>的概念. 3..ulh>l ...

  10. Linux内存管理5---物理内存管理

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...