前言
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. div仿textarea可输入

    原本要用textarea,但是后来发现好像只有IE支持textarea里边使用html标签,由于需要在textarea中显示一条横线(<hr />),在网上查了很久,都说textarea是 ...

  2. hdu2037今年暑假不AC(贪心,活动安排问题)

    今年暑假不AC Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  3. Visual Studio Code 工具使用教程

    软件下载这里就不用讲了,安装完之后: 1.切换中文: 选择扩展 搜索“Language”,在下列选项选择 Chinese (Simplified) Language Pack for Visual S ...

  4. Python全栈 MongoDB 数据库(Mongo、 正则基础、一篇通)

                  终端命令:       在线安装:         sudo apt-get install mongodb         默认安装路径 :  /var/lib/mong ...

  5. python 终极篇 ---django 认证

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  6. 树莓派怎么连接无线网wifi?

    没有显示器的同学,想要连接无线网,一定非常苦恼,前面教会了大家远程登录图形界面,下面我将教会大家:在没有图形界面的情况下,怎么连接树莓派WiFi.同样还是利用putty远程访问软件登录,但这次不需要登 ...

  7. 微信小程序navigator跳转失效

    在编写小程序时遇到一个问题:使用 <navigator url='/pages/lists/index'>...</navigator>进行跳转没有反应.控制台也没有报错,ap ...

  8. Pandas基础教程

    pandas教程 更多地可以 参考教程 安装 pip install pandas pandas的类excel操作,超级方便: import pandas as pd dates = pd.date_ ...

  9. Python3 小工具-UDP扫描

    from scapy.all import * import optparse import threading def scan(target,port): pkt=IP(dst=target)/U ...

  10. js经典试题之w3规范系列

    js经典试题之w3规范系列 1:w3c 制定的 javascript 标准事件模型的正确的顺序? 答案:事件捕获->事件处理->事件冒泡 解析:先事件捕获从windows > doc ...