前言
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. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理

    C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理 当公司有几万人,上千家加盟网点,几个庞大的直属分公司后,系统账户的有效管理也是一个头疼的问题,把所有的帐户及时进行科学 ...

  2. Qt-QML-自定义个自己的文本Text

    好久都没有正经的更新自己的文章了,这段时间也辞职了,听了小爱的,准备买个碗,自己当老板,下面请欣赏效果图 这个界面布局就是自己是在想不到啥了,按照常规汽车导航的布局布局了一下,主要看内容哈,看看这个文 ...

  3. Micro:bit 硬件架构介绍

    Micro:bit做为当红的少儿编程工具,这两年在编程教育领域越来越火.今天就从硬件架构开始,分享Micro:bit的相关主题. Microbit 硬件设计是根据ARM mbed技术所开发的应用IC及 ...

  4. LabVIEW初篇---前言

    最早接触labview,是研二的时候,2007年,当时为了补贴家用,改善生活.自己拿着本科毕业证去找工作,去一个企业面试,当时,面试的主考官,问了会什么吗,比如PLC.单片机啥的?那时候的自己,基本上 ...

  5. git 跟踪分支 远程跟踪分支 学习笔记

    远程跟踪分支相当于一个只读仓库指针,从服务器上获取数据,不可以被本地直接修改. 跟踪分支相当于一个本地指针   用于项目更新和迭代. 1跟踪分支  (tracking  branch)   逻辑示意图 ...

  6. 166. Nth to Last Node in List

    Description Find the nth to last element of a singly linked list. The minimum number of nodes in lis ...

  7. 并发HashMap的put操作引起死循环

    今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有一个原因是:线程不安全的HashMap, HashMap在并发执行put操作时会引起死循环,是因为多线程会 ...

  8. 【机器学习】线性回归python实现

    线性回归原理介绍 线性回归python实现 线性回归sklearn实现 这里使用python实现线性回归,没有使用sklearn等机器学习框架,目的是帮助理解算法的原理. 写了三个例子,分别是单变量的 ...

  9. Python3.5 Keras-Theano(含其他库)windows 安装环境

    https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.2.0-Windows-x86.execonda --version ...

  10. Thunder团队第五周 - Scrum会议3

    Scrum会议3 小组名称:Thunder 项目名称:i阅app Scrum Master:王航 工作照片: 苗威同学在拍照,所以不在照片内. 参会成员: 王航(Master):http://www. ...