目录

REST 请求风格概述

Form 表单发起 put 请求

格式化日期请求参数

HTTP 响应内容压缩


REST 请求风格概述

1、HTTP 协议是一个广泛应用的 Internet 协议,提供了8个不同的请求方法(常见的是前 4 个):

请求方式 描述
GET  向特定资源发出请求(请求指定页面信息,并返回实体主体)
POST 向指定资源提交数据进行处理请求(提交表单、上传文件)
PUT 向指定资源位置上上传其最新内容
DELETE 请求服务器删除指定的资源
HEAD
OPTIONS
TRACE
CONNECT

2、REST 全称 Representational State Transfer ——(资源)表现层状态转化,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用。

3、REST 风格就是通过 Http 请求方式的不同来标识不同的方法,即对于同一个请求路径,可以根据请求方式的不同来区分它们。

操作 普通CRUD(根据uri区分)               REST风格CRUD(根据请求方式区分)        
查询 localhost:8080/tiger/findUsers localhost:8080/tiger/user-----get方式请求
添加 localhost:8080/tiger/saveUser localhost:8080/tiger/user-----post方式请求
修改 localhost:8080/tiger/updateUser localhost:8080/tiger/user-----pup方式请求
删除 localhost:8080/tiger/deleteUser localhost:8080/tiger/user-----delete方式请求

4、@RequestMapping 需要结合 RequestMethod 指定请求的 Http 方式,有:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE,所以封装之后就得到了各种请求方式对应的注解。(不能完全一概而论谁优谁劣,有时候习惯就好)。

5、如 @GetMapping 内部就是 @RequestMapping(method = RequestMethod.GET),这些注解的属性和 @RequestMapping是一样的。

操作 举例
查询所有用户     @GetMapping("user")
    public String findUsers(Model model) {
根据 id 查询用户     @GetMapping("user/{id}")
    public String findUserById(@PathVariable(name = "id") Integer id, Model model) {
添加用户     @PostMapping("user")
    public String saveUser(User user) {
修改用户     @PutMapping("user")
    public String updateUser(User user) {
根据 id 删除用户     @DeleteMapping("user/{id}")
    public String deleteUser(@PathVariable(name = "id") Integer id) {

Form 表单发起 put 请求

1、form 表单的 method  属性值只有 get 与 post 两种,所以 form 表单使用 put、delete 等其它请求方式时,需要特殊处理。

1)表单 method 属性值仍然指定为 post。

2)表单中创建一个隐藏的 input 项,name 属性值强制为 "_method",value 属性值指定此 form 请求的具体方式,如 put、delete 等

2、如果使用类似 JQuery 的 $.ajax 的方式,则可以使用它的 type 属性直接指定请求方式,如 type: put。

3、环境:Java jdk 1.8 +Spring boot 2.1.3 + Thymeleaf。

4、后台接口如下,主要用于模拟向页面传递数据与接收数据:

    /*** 修改提交时调用此接口, put 请求:  http://localhost:8080/example/httpPut** @param user* @return*/@PutMapping("example/httpPut")@ResponseBodypublic String httpPut(User user) {//将数据返回给页面,不操作数据.String valueAsString = "{}";try {ObjectMapper objectMapper = new ObjectMapper();valueAsString = objectMapper.writeValueAsString(user);} catch (JsonProcessingException e) {e.printStackTrace();}return valueAsString;}

5、前端修改页面如下,使用 Thymeleaf 处理数据,使用 form 表单发送 put 请求(其它 delete 请求方式也是同理):

<div style="width: 500px;height:400px;border: #1b6d85 1px solid;margin: auto;padding: 20px"><form action="" method="post" th:action="@{/example/httpPut}"><!--form的method只有get与post两种,使用put方式时:--><!--创建一个input隐藏项,name强制为 "_method",value值就指定此form请求的方式--><!--th:if 表达式:条件满足时生成标签,否则不生成标签--><input type="hidden" name="_method" value="put" th:if="${user!=null}"><!--主键id做成隐藏项,修改时根据id进行修改--><input type="hidden" name="id" th:if="${user!=null}" th:value="${user.id}"><!--三元运算符,当user不等于null时,取User的属性值,否则为空-->姓名:<input type="text" name="name" th:value="${user!=null}?${user.name}"><br><br>薪水:<input type="text" name="salary" th:value="${user!=null}?${user.salary}"><br><br>学历:<select name="education"><!--th:each 表达式用于遍历集合,如果当前学历项等于用户的学历,则让它默认选中--><option th:each="education:${educationArr}"th:text="${education}"th:value="${education}"th:selected="${user.education!=null}?${user.education==education}"></option></select><br><br><!--#dates.format 是 thymeleaf 格式化日期的方式-->生日:<input type="text" name="birthday"th:value="${user.birthday!=null}?${#dates.format(user.birthday, 'yyyy-MM-dd HH:mm:ss')}"><br><br><button type="submit" class="btn btn-primary">修改</button><br><br></form>
</div>

在线演示源码:

src/main/java/com/wmx/thymeleafapp/controller/ExampleController.java · 汪少棠/thymeleafapp - Gitee.com

src/main/java/com/wmx/thymeleafapp/pojo/User.java · 汪少棠/thymeleafapp - Gitee.com

src/main/resources/templates/examples/httpPut.html · 汪少棠/thymeleafapp - Gitee.com

格式化日期请求参数

1、页面提交的日期参数,Spring MVC 会自动转换成 Date 类型,默认支持 "/" + ":" 分隔的方式,即年月日必须是 "/" 分割,时分秒必须是 ":" 分割,如 1993/08/25 08:12:22,否则报错: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'

2、Spring boot 官方文档 默认配置如下,spring.mvc.date-format 默认使用 "/" 格式,如果需要使用其它格式,则在全局配置文件中覆盖即可,如:spring.mvc.date-format=yyyy-MM-dd HH:mm:ss

# SPRING MVC (WebMvcProperties)
spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.
spring.mvc.contentnegotiation.favor-parameter=false # Whether a request parameter ("format" by default) should be used to determine the requested media type.
spring.mvc.contentnegotiation.favor-path-extension=false # Whether the path extension in the URL path should be used to determine the requested media type.
spring.mvc.contentnegotiation.media-types.*= # Map file extensions to media types for content negotiation. For instance, yml to text/yaml.
spring.mvc.contentnegotiation.parameter-name= # Query parameter name to use when "favor-parameter" is enabled.
spring.mvc.date-format= # Date format to use. For instance, `dd/MM/yyyy`.
spring.mvc.dispatch-trace-request=false # Whether to dispatch TRACE requests to the FrameworkServlet doService method.

3、除了在配置文件中指定,也可以使用 org.springframework.web.bind.WebDataBinder API 转换日期。

  /*** 自定义日期转换器* Spring3.0 之前是会自动转换的,但是 3.0 之后需要程序员自己转换* 直接将 @InitBinder... 注解的方法放置在 @Controller 中即可** @param dataBinder*/@InitBinderpublic void initBind(WebDataBinder dataBinder) {/**指定日期格式*/DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss");/**指定日期/时间解析是否不严格* lenient - 为 true 时,解析过程是不严格的*/dateFormat.setLenient(true);/**Date.class:表示这是注册的是日期类型* new CustomDateEditor(dateFormat, true):true 表示允许为空*/dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));}

4、无论是 spring.mvc.date-format 还是 WebDataBinder 都需要注意:

1)假如指定格式为 yyyy-MM-dd ,则传入的日期字符串只能是 "-" 分割,如果传入 1993/08/25 则报错
2)假如指定格式为 yyyy-MM-dd ,则传入 1993-08-25 12:08:25 时,时分秒会强制为0,如 1993-08-25 00:00:00
3)假如指定格式为 yyyy-MM-dd HH:mm:ss,则必须同时传入时分秒,否则报错,如传入 1993-08-15 则报错.

在线源码:src/main/java/com/wmx/thymeleafapp/controller/SystemController.java · 汪少棠/thymeleafapp - Gitee.com

HTTP 响应内容压缩

1、程序返回的数据量越大,占用的网络带宽也就越大,响应的时间也就越长,此时对响应数据进行压缩是个不错的优化方式,亲测一个原本返回 1.35M 的接口,在压缩后返回的大小为 154.2KB,压缩率达 90% 左右。

2、浏览器默认是支持数据压缩的,会自动对 gzip 压缩的数据进行解压,F12 打开网络,可以看到请求头中会有:'Accept-Encoding: gzip, deflate, br'。

3、对响应数据开启压缩的最常见的方式有:1)使用 Nginx 配置,2)Spring boot 应用配置(本文介绍此种方式)。

4、Jetty、Tomcat 和 Undertow 都支持 HTTP 响应压缩,对于内嵌的 Servlet 容器而言,直接在 application.properties、application.yml 中配置即可(官网):

server:#如果是微服务环境,所有请求需要通过网关转发和返回时,则以下配置需要配置在网关上,而不是目标微服务上compression:#是否对响应数据开启gzip压缩,默认falseenabled: true#响应内容长度超过设置大小时进行压缩,默认值为2048(2KB,不带单位时默认为字节)min-response-size: 10KB#对指定的响应类型进行压缩,值是数组,用逗号隔开mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml

5、默认情况下,要执行压缩,响应的长度至少为 2048 字节,可以通过 server.compression.min-response-size 属性配置。

6、默认情况下,仅当响应的内容类型为以下内容之一时,才会对其进行压缩,可以通过 mime-types 属性配置:text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xm

l

Spring Boot REST 请求(GetMapping,PostMapping)、格式化日期参数、压缩响应内容相关推荐

  1. spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天

    spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天 分析: 解决办法 分析: 经过测试,时间从前台传到后台数据是一样的,说明是后台向数据库传递过程中出现了问题 解决办法 ...

  2. Spring Boot 异步请求和异步调用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.Spring Boot中异步请求的使用 1.异步请求与同步请求 ...

  3. Spring Boot 异步请求和异步调用,一文搞定!

    一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...

  4. spring boot处理请求返回值的格式(自定义消息转换器)

    springboot 将对象转化成json对象返回给前端,是通过多个消息转换器配合完成的 但是有些时候,默认的转化格式未必符合我们的要求,这个时候就需要进行自定义消息转换器 只需要在@Configur ...

  5. Spring Boot——一种包含分页和排序参数的接收方法DEMO

    Maven 主要Maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifac ...

  6. Spring Boot中使用模板引擎参数化传参数

    目录 理论 代码及演示 理论 在导航页里面,当点击某个栏目的时候,就得被激活,在Spring Boot中,一般把导航页做成片段的形式,这个片段是可以根据参数进行激活某一个栏目,如下的演示所示,通过三元 ...

  7. Spring boot转发请求

    转发请求 Forward 表示转发到一个地址 ThymeleafViewResolver Spring MVC的视图解析器 作用,根据视图名,得到视图对象 createView 创建视图对象 view ...

  8. Spring boot重定向请求

    重定向 Redirect 表示重定向到一个地址 ThymeleafViewResolver Spring MVC的视图解析器 作用,根据视图名,得到视图对象 createView 创建视图对象 vie ...

  9. Spring boot(4) web开发(2) 请求处理、响应处理、模板引擎

    参照教程:https://www.bilibili.com/video/BV19K4y1L7MT 1.请求映射 1.1 rest使用与原理 1.1.1 使用 Rest风格支持(使用HTTP请求方式动词 ...

  10. 学习Spring Boot:(十一) 自定义装配参数

    前言 SpringMVC 中 Controller 中方法的参数非常灵活,得益于它的强大自动装配,这次将根据上次遗留下的问题,将研究下装配参数. 正文 SpringMVC中使用了两个接口来处理参数: ...

最新文章

  1. 呼叫中心最难的问题是什么?
  2. Tangram base的设计思路
  3. java arrays.sort() c_正面刚算法-Java中Arrays.sort()(一)
  4. 苹果Mac操作系统下怎么显示隐藏文件
  5. 蚂蚁前端的开局十年:一切都在路上
  6. python random函数_详细代码实战讲解:如何用 Python让自己变成天选之子
  7. python 将数据写入csv文件
  8. ZetCode 教程翻译计划正式启动 | ApacheCN
  9. wh计算公式_“笔记本”电池里的mAh和Wh有啥区别
  10. Convert.ToInt32、(int)和int.Parse 三者的区别 转
  11. adb驱动和adb工具官方下载链接
  12. Android开发者必备工具-常见Android模拟器(MuMu、夜神、蓝叠、逍遥、雷电、Genymotion...)
  13. mongodb安装及5安装studio 3t和studio3t破解
  14. leaflet地图原理_Leaflet地图框架使用手册
  15. android视频添加特效,安卓手机视频特效软件 用手机给视频加特效 安卓手机视频加闪电特效...
  16. 请结合实例说明欧洲中世纪哥特式建筑的风格特点
  17. 文件读写处理:古诗问题
  18. 计算机节熊测试报告,PWC170机能实验.pptx
  19. imac2017拆机
  20. VWware虚拟机如何设置固定的IP地址(详细步骤)

热门文章

  1. 你不知道的outerText,innerText
  2. Office Tip(1) : Split the Screen
  3. 漫谈 Clustering (2): k-medoids
  4. java 启动顺序_java语句执行顺序
  5. 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
  6. 拓端tecdat|R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析
  7. 带动量的随机梯度下降法_梯度下降法(SGD)原理解析及其改进优化算法
  8. 图像处理-绘制直方图
  9. (9)数据结构-双端队列
  10. 计算机操作系统笔记(三)