前言
rest风格严格意义上说不是一种标准,而是一种风格,在如今互联网界,这个风格被广泛用于微服务系统之间的交互。

REST简单介绍

REST(Representional State Transfer)直译为表现层状态转换。针对REST和RESTful的介绍,觉得这篇博客写的不错,可以参看一下REST,RESTful介绍.

其实总结起来也就几句话,rest设计规范为通过url表示接口名,HTTP请求方式来区分请求类型。同时前端根据HTTP状态响应码做相应的处理。

HTTP的动作
HTTP存在创建,修改,访问,删除。这几种操作。

rest风格的url一般不会出现动词,区分动作的任务已经交给了HTTP协议了。

关于rest风格有一些建议:

1、一般不应该在URI中存在动词

2、不要在URI中加入版本号

3、建议参数超过5个,通过JSON请求传递参数

之前在总结spring mvc的时候简单总结过@RequestMapping让URL映射到对应的控制器,不过为了更好的支持REST风格的开发,spring之后还提供了@GetMapping,@PostMapping,@PutMapping,@PatchMapping,@DeleteMapping

通过@RequestMapping、@GetMapping等注解可以定位到指定的控制器方法上,通过注解@PathVariable就能够将URI地址参数获取,通过@ResponseBody可以将请求体为json的数据转换为负责的java对象。下面开始进行实例说明,这里只举例POS和GET请求对应的rest请求。

REST请求实例
1、对应的bean对象

public class User {
private Long id;
private String userName;
private SexEnum sex = null;
private String note;

//这里省略getter和setter方法

}
2、对应的UserVO

public class UserVo {
private Long id;
private String userName;
private int sexCode;
private String sexName;
private String note;

//省略getter和setter方法
}
3、对应的controller

package com.learn.chapter11.controller;

import com.learn.chapter11.domain.User;
import com.learn.chapter11.enumeration.SexEnum;
import com.learn.chapter11.service.UserService;
import com.learn.chapter11.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
* autor:liman
* mobilNo:15528212893
* mail:657271181@qq.com
* comment:
*/
@Controller
public class UserController {

@Autowired
private UserService userService;

@GetMapping("/index")
public String index() {
System.out.println("test index");
return "restful";
}

@PostMapping("/user")
@ResponseBody
public User insertUser(@RequestBody UserVo userVo) {
User user = this.changeToPo(userVo);
System.out.println(user.toString());
return user;
}

@GetMapping(value = "/user/{id}")
@ResponseBody
public UserVo getUser(@PathVariable("id") Long id) {
User user = new User();
user.setNote("just test");
user.setId(id);
user.setUserName("liman");
user.setSex(SexEnum.MALE);
return changeToVo(user);
}

@GetMapping(value = "/users/{userName}/{note}/{start}/{limit}")
@ResponseBody
public List<UserVo> findUsers(
@PathVariable("userName"www.thd178.com) String userName,
@PathVariable("note"www.gcyL157.com) String note,
@PathVariable("start"www.mhylpt.com/) int start,
@PathVariable("limit") int limit) {
System.out.println(userName+":"+note+":"+start+":"+limit);
List<User> userList = userService.findUsers(userName, note, start, limit);
return this.changeToVoes(userList);
}

@PutMapping("/user/{id}")
@ResponseBody
public User updateUser(@PathVariable("id") Long id,@RequestBody UserVo userVo){
User user = this.changeToPo(userVo);
user.setId(1L);
userService.updateUser(user);
return user;
}

//将VO对象转换的po
private User changeToPo(UserVo userVo) {
User user = new User();
user.setSex(SexEnum.getSexEnum(userVo.getSexCode()));
user.setUserName(userVo.getUserName());
user.setId(userVo.getId());
user.setNote(userVo.getNote());
return user;
}

// 转换PO变为VO
private UserVo changeToVo(User user) {
UserVo userVo = new UserVo(www.michenggw.com);
userVo.setId(user.getId(www.dasheng178.com));
userVo.setUserName(user.getUserName());
userVo.setSexCode(user.getSex(www.ysyl157.com ).getCode());
userVo.setSexName(user.getSex(www.meiwanyule.cn).getName());
userVo.setNote(user.getNote());
return userVo;
}

// 将PO列表转换为VO列表
private List<UserVo> changeToVoes(List<User> poList) {
List<UserVo> voList = new ArrayList<>();
for (User user : poList) {
UserVo userVo = changeToVo(user);
voList.add(userVo);
}
return voList;
}
}
由于需要拼接json数据进行测试,这里不用postman进行测试,为了直观,还是采用老套的jsp操作即可。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试restful请求</title>
<script type="text/javascript"
src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">

function post() {
var params = {
'id':'1',
'userName': 'user_name_new',
'sexCode': 1,
'note': "note_new"
}
$.post({
url: "./user",
// 此处需要告知传递参数类型为JSON,不能缺少
contentType: "application/json",
// 将JSON转化为字符串传递
data: JSON.stringify(params),
// 成功后的方法
success: function (result) {
if (result == null || result.id == null) {
alert("插入失败");
return;
}
alert("插入成功");
}
});
}

post();

function get() {
$.get("./user/1", function (user, status) {
if (user == null) {
alert("结果为空")
} else {
alert("用户信息为" + JSON.stringify(user));
}
});
}

get();

function findUsers() {
$.get("./users/u/n/0/5", function (user, status) {
if (user == null) {
alert("结果为空")
} else {
alert("用户信息为:" + JSON.stringify(user));
}
});
}

findUsers();

</script>
</head>
<body>
<h1>测试RESTful下的请求</h1>
</body>
</html>
其实使用的部分没有总结太多,只是针对@PathVariable注解的使用进行了总结,这个注解就是在url中获取参数。同时:使用@RestController注解可以将控制器返回的对象转换为json数据集。

结果的渲染
@RestController注解会自动将控制器方法返回的值自动转换成json数据,这个其实在Spring mvc的深入理解中做了介绍,但是没有很好的条理性。

其实spring mvc的数据转换是通过HTTPMessageConverter接口的实现类完成,在Spring MVC中,IOC容器会自动注册两个HttPMessageConverter接口的实现类,他们分别为StringHTTPMessageConverter和MappingJackson2HttPMessageConverter。spring mvc在执行控制器的方法之后会去遍历注册的HttpMessageConverter接口的实现类,使用canWrite方法去判断是否拦截控制器的返回。对于HttpMessageConverter机制没有处理的数据模型,按spring mvc的流程,会流转到视图解析器(ViewResolver)

处理HTTP状态码、异常和响应头
当资源发生找不到的异常时,需要返回客户端指定的状态码,spring mvc其实已经提供了实体封装类ResponseEntity和注解@ResponseStatus。ResponseEntity可以有效的封装错误信息和状态码,通过@ResponseStatus可以配置指定的响应码给客户端。

@ResponseStatus和@ResponseBody注解一样,都是标记在方法上

@PostMapping("/successHeader2")
//直接在注解上加入返回成功的状态码
@ResponseStatus(HttpStatus.CREATED)
public UserVo insertUserSuccess(@RequestBody UserVo userVo){
User user = this.changeToPo(userVo);
userService.insertUser(user);
UserVo result = this.changeToVo(user);
return result;
}
RestTemplate请求
To be Continued......

Spring boot——构建rest风格的更多相关文章

  1. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  2. Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  3. 使用Ratpack与Spring Boot构建高性能JVM微服务

    在微服务天堂中Ratpack和Spring Boot是天造地设的一对.它们都是以开发者为中心的运行于JVM之上的web框架,侧重于生产率.效率以及轻量级部署.他们在服务程序的开发中带来了各自的好处.R ...

  4. 使用Spring boot开发RestFul 风格项目PUT/DELETE方法不起作用

    在使用Spring boot 开发restful 风格的项目,put.delete方法不起作用,解决办法. 实体类Student @Data public class Student { privat ...

  5. Spring Boot构建的Web项目如何在服务端校验表单输入

    本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...

  6. [转] 使用Spring MVC构建REST风格WEB应用

    原文地址:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理 ...

  7. Spring boot构建基于rest的Web服务

    一.介绍:使用Spring Boot我们可以很容易的创建一个可独立运行的Rest web服务,其中内嵌tomact,我们只需“run”就可以查看效果了. Spring Boot利用Gradle或Mav ...

  8. 使用Spring MVC构建REST风格WEB应用

    转自:http://fancy888.iteye.com/blog/1629120 对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理数据 ...

  9. Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序

    一.前言 什么是Spring Boot?Spring Boot就是一个让你使用Spring构建应用时减少配置的一个框架.约定优于配置,一定程度上提高了开发效率.https://zhuanlan.zhi ...

随机推荐

  1. 使数据可供ArcGIS Server访问

    内容来自ESRI官方文档(点击访问),简单总结如下: 1 ArcGIS Server用于发布服务的数据必须存储在服务器可以访问的位置: 2 这样的位置有三种类型: 本地路径:将数据本地存储在每台 Ar ...

  2. 60帧的丝般顺畅 - QQ飞车手游优化点滴

    WeTest 导读 加入项目组的这段时间主要是承担性能优化这块的工作,同时也会去实现一些场景材质.特效材质以及工具.今天就性能优化这块分享一下个人的经验. 设备等级划分 设备等级划分是一切优化,LOD ...

  3. 「日常训练」Duff in the Army (Codeforces Round #326 Div.2 E)

    题意(CodeForces 588E) 给定一棵\(n\)个点的树,给定\(m\)个人(\(m\le n\))在哪个点上的信息,每个点可以有任意个人:然后给\(q\)个询问,每次问\(u\)到\(v\ ...

  4. 怎样安装JMeter

    JMeter有图形界面, 而且支持中文! JMeter官网地址: http://jmeter.apache.org/ 点击左上角的下载: 点击下面的.zip后缀的压缩包: 解压到本地: JMeter目 ...

  5. Selenium自动化测试第一天(下)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  6. Python中一些糟糕的语法!你遇到过吗?还知道那些?

    Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言. 其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL ...

  7. vue-router爬坑记

    简介 因为我们用Vue开发的页面是单页面应用,就相当于只有一个主的index.html,这时候我们就不能使用a标签来进行页面的切换了,所以这时候我们今天的主角Vue-Router就闪亮的登场了 Vue ...

  8. centos端口管理

    centos 6.5 ###############配置filter表防火墙############### #清除预设表filter中的所有规则链的规则iptables -F #清除预设表filter ...

  9. cygwin—excellent work!

    使用cygwin的好处在于可以避免直接使用linux同时又能最大限度的节省资源,共享windows的资源. 安装cygwin 安装安简单,当然,你首先需要使用163或者国内或者亚洲比较好的镜像作为下载 ...

  10. day-18 滑动平均模型测试样例

    为了使训练模型在测试数据上有更好的效果,可以引入一种新的方法:滑动平均模型.通过维护一个影子变量,来代替最终训练参数,进行训练模型的验证. 在tensorflow中提供了ExponentialMovi ...