前言
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. sqlite helper

    //-------------------------------------------------------------------------- // // Copyright (c) BUS ...

  2. C++中的引用常见用法

    1.引用的内涵 引用就是给变量取外号而已. 2.四种不能使用引用的情况 void &r=x; //不能建立void类型引用 int &&r=x; //不能建立引用的引用 int ...

  3. 图的基本算法(BFS和DFS)

    图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...

  4. Python 通过sgmllib模块解析HTML

    """ 对html文本的解析方案-示例:在标签开始的时候检查标签中的attrs属性,解析出所有的参数的href属性值 依赖安装:pip install sgmllib3k ...

  5. Javascript打印网页局部的实现方案

    项目中,需要对页面的部分div进行打印,为了保证界面布局不乱,采取了新建iframe的方法. 将需要打印的div放到iframe中,然后调用iframe进行打印,就可以很好的实现局部打印的效果了. 同 ...

  6. jQuery用unbind方法去掉hover事件及其他方法介绍

    近日项目开发十分的繁忙,其中一个需求是实现响应式导航.(响应式的问题我们在css相关的博客中再交流) 大家都知道导航是需要下来菜单效果的,必然就会用到 jQuery的 hover() 方法.若是导航放 ...

  7. CVPR2018 关于视频目标跟踪(Object Tracking)的论文简要分析与总结

    本文转自:https://blog.csdn.net/weixin_40645129/article/details/81173088 CVPR2018已公布关于视频目标跟踪的论文简要分析与总结 一, ...

  8. 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧

    由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识.课程分为5个部分(粗体部分为已经看过的): 神经网络和深度学习 改善深层神经网络:超参数调试.正则化以及优化 ...

  9. Thunder团队——事后诸葛亮会议

    小组名称:Thunder 项目名称:爱阅APP 小组成员:王航 李传康 代秋彤 邹双黛 苗威 宋雨 胡佑蓉 杨梓瑞 一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型 ...

  10. 一步步学敏捷开发:1、敏捷开发及Scrum介绍

    敏捷开发之 历史背景 20世纪60年代:软件作坊,软件规模小,以作坊式开发为主:70年代:软件危机,硬件飞速发展,软件规模和复杂度激增,引发软件危机:80年代:软件过程控制,引入成熟生产制造管理方法, ...