0106 springMVC REST风格

混合现实
• 阅读 1744

markdown xx笔记语法练习带快捷键的

加粗 快捷键 cmd+b
斜体 cmd+i
分割线 cmd+u


编号列表: cmd+shift+o
无编号列表 cmd+shift+u
待办事项 cmd+shift+T
代码块 cmd+shift+P

  1. 编号列表项目1
  2. 编号项目列表2
  • 无编号列表项目1;
  • 无编号列表项目2;
  • [ ] 待办事项1
  • [ ] 待办事项2
System.out.println("hello world");

背景

rest是一种http协议的风格,在互联网时代这种风格在微服务中流行起来了,客户端对微服务,微服务之间交互;
一个URL代表一个资源,里面都是名词;

REST介绍

REST 全称 Representational state Transfer 表现层状态转换;是一种软件架构原则;
  1. 资源:具体存在的对象比如用户,角色,菜单,文本,图片,歌曲;用URI来描述;
  2. 表现层:如何表示资源,现在最流行的是json;
  3. 状态转换;资源并不是一成不变的是一个变化的过程,可以经历create,visit,update,delete;

HTTP的动作

请求方法 动作
GET 查询
POST 新增
PUT 修改全部
PATCH 修改部分
DELETE 删除
  1. URL中不应该出现动词
  2. 版本号放在URL中,应该移动到Header中
  3. 如果参数不多,应该放在path中,而不是通过getParam的方法传递,参数超过4个,应该把参数放到请求体,通过json传递;

SpringMVC对REST风格的支持

@RequestMapping是通用的url配置注解,为了支持rest,springboot引入了更多的注解;
注解 方法 说明
@GetMapping GET 查询
@PostMapping POST 新增
@PutMapping PUT 修改全部
@PatchMapping PATCH 修改部分
@DeleteMapping DELETE 删除

以上注解的方法中可以配置consumers,produces,即接受什么类型的资源请求,输出什么格式的资源;

  1. url上的path参数通过注解@PathVariable配置;
  2. 请求体的参数通过@RequestBody配置;
  3. 返回json数据,在方法申明位置配置@ResponseBody,或者在控制器上配置@RestController;如果需要返回其它格式的数据到客户端,通过协商资源视图解析器来配置;

渲染结果

springmvc返回结果的流程有两种:

  1. @ResponseBody注解标识的控制器方法,无需视图解析器,使用MappingJackson2HttpMessageConverter转换输出;
  2. 使用ModelAndView,需要配置视图解析器;

springMVC容器启动的时候,默认注册了两个HttpMessageConverter,即:
1.StringHttpMessageConverter; 按照字符串输出;(produces=Text_plan_value)
2.MappingJackson2HttpMessageConverter;按照json字符串输出;(produces=xxxjson)

如果按照请求类型,找不到对应的HttpMessageConverter,则会流转到 ContentNegotiatingViewResolver,对结果进行解析;
springmvc内置了如下的视图解析器:

  1. BeanNameViewResolver;
  2. ViewResolverComposite
  3. InteernalResourceViewResolver;

@ResponseStatus注解标注在控制器方法上,可以设置响应状态码;
ResponseEntity对象也可以设置响应状态码和响应头信息;

统一异常处理
可以在@ExceptionHandler标注的异常处理方法上,标注@ResponseStatus,统一设置异常返回的响应状态码;

RestTemplate

为了完成微服务系统之间的REST调用,springMvC提供了 RestTemplate,它的底层是使用HttpURLConnection实现的;
 public static void testGet(){
         RestTemplate restTemplate = new RestTemplate();

        String url = "https://xxx.yyy.com/tiananuser_service/testNewUser/new/{plat}/{start}/{end}?requestId=x";
        Map<String, Object> params = new HashMap<>(3);
        params.put("plat",0);
        params.put("start","2019-12-20");
        params.put("end","2020-01-06");

        final ResponseEntity<Object> responseEntity = restTemplate.getForEntity(url, Object.class, params);

        System.out.println("responseEntity.getStatusCodeValue() : "+ responseEntity.getStatusCodeValue());
        System.out.println("responseEntity.getBody() : "+ responseEntity.getBody());


    }

小结

  • 简单的介绍了REST ,即表现层状态转移,是一种架构原则;
  • 介绍了springMVC对REST的支持,提供了5个方法注解;
  • 简单介绍了使用REST访问的客户端RestTemplate ;
原创不易,转载请注明出处,欢迎沟通交流。
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
22 22
4年前
二叉树创建后,如何使用递归和栈遍历二叉树?
0.前言前文主要介绍了树的相关概念和原理,本文主要内容为二叉树的创建及遍历的代码实现,其中包括递归遍历和栈遍历。1.二叉树的实现思路1.0.顺序存储——数组实现前面介绍了满二叉树和完全二叉树,我们对其进行了编号——从0到n的不中断顺序编号,而恰好,数组也有一个这样的编号——数组下标,只要我们把二者联合起来,数组就能存储二叉树了。那么非满
DevOpSec DevOpSec
4年前
Linux主机安全配置
1.安全配置规范1.身份鉴别1.账号检查<tableborder"1"cellspacing"0"style"width:426.1pt;"<tbody<tr<tdstyle"width:113.4pt;"<pstyle"marginleft:0pt;"<strong<strong安全配置编号
Wesley13 Wesley13
3年前
CSS 计数器的妙用:数字递增动效
!(https://oscimg.oschina.net/oscnet/f5d0e4c18b3547b1b5549fe37351ae72.gif)  持续进步的同学都关注了“1024译站”CSS计数器是由CSS维护的变量,这些变量可根据CSS规则增加从而跟踪使用次数。我们可以利用这个特性,根据文档位置来调整内容表现,比如显示列表编号
Wesley13 Wesley13
3年前
Java开发者容易犯的十个错误
!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr
Wesley13 Wesley13
3年前
PIC中档单片机汇编指令详解(5)
位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指
Wesley13 Wesley13
3年前
mysql关于自动编号问题 转载
MySql数据库唯一编号字段(自动编号字段)在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO\_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。ISAM表如果把一个NULL插入到一个AUTO\_INCREMEN
Wesley13 Wesley13
3年前
idea的快捷键(复制) IntelliJ Idea 常用快捷键列表
CtrlShiftEnter,语句完成“!”,否定完成,输入表达式时按“!”键CtrlE,最近的文件CtrlShiftE,最近更改的文件ShiftClick,可以关闭文件Ctrl\OR\,可以跑到大括号的开头与结尾CtrlF12,可以显示当前文件的结构CtrlF7,可以查询当前元素在当
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
C 语言实例
30个人在一条船上,超载,需要15人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15人为止,问都有哪些编号的人下船了呢?include<stdio.hintc0;inti1;intj0;
Stella981 Stella981
3年前
Bzoj4899 记忆的轮廓
B.记忆的轮廓题目描述通往贤者之塔的路上,有许多的危机。我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1n的简单路径上,编号依次递增,在\1,n\中,一共有n个节点。我们把编号在\1,n\的叫做正确节点,\n1,m\的叫做错误节点。一个叶子,如果是正确节点则为正确叶子,否则称