当前位置:   article > 正文

Spring Boot REST 请求(GetMapping,PostMapping)、格式化请求与响应的日期时间、压缩响应内容,解决查询的时间减少了8小时_rest请求

rest请求

目录

REST 请求风格概述

Form 表单发起 put 请求

格式化日期请求与响应(解决查询的时间减少了8小时)

spring.mvc.date-format

WebDataBinder  转换日期

spring.jackson.date-format(推荐)

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/findUserslocalhost:8080/tiger/user-----get方式请求
添加localhost:8080/tiger/saveUserlocalhost:8080/tiger/user-----post方式请求
修改localhost:8080/tiger/updateUserlocalhost:8080/tiger/user-----pup方式请求
删除localhost:8080/tiger/deleteUserlocalhost: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) {

src/main/java/com/wmx/yuanyuan/controller/VisitsController.java · 汪少棠/yuanyuan - Gitee.com

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、后台接口如下,主要用于模拟向页面传递数据与接收数据:

  1. /**
  2. * 修改提交时调用此接口, put 请求: http://localhost:8080/example/httpPut
  3. *
  4. * @param user
  5. * @return
  6. */
  7. @PutMapping("example/httpPut")
  8. @ResponseBody
  9. public String httpPut(User user) {
  10. //将数据返回给页面,不操作数据.
  11. String valueAsString = "{}";
  12. try {
  13. ObjectMapper objectMapper = new ObjectMapper();
  14. valueAsString = objectMapper.writeValueAsString(user);
  15. } catch (JsonProcessingException e) {
  16. e.printStackTrace();
  17. }
  18. return valueAsString;
  19. }

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

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

格式化日期请求与响应(解决查询的时间减少了8小时)

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、无论是哪种方式都需要注意

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 则报错.

4)日期对象默认不支持 java.time.LocalDateTime,否则格式化无效。

spring.mvc.date-format

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

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

2、2.3.5 版本 Web properties 版本开始属性名称有些调整: 

spring.mvc.format.date

格式化日期, 如 `dd/MM/yyyy`.

spring.mvc.format.date-time

格式化日期加时间, 如 `yyyy-MM-dd HH:mm:ss`.

src/main/resources/application.yml · 汪少棠/thymeleafapp - Gitee.com

WebDataBinder  转换日期

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

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

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

src/main/resources/application.yml · 汪少棠/thymeleafapp - Gitee.com

spring.jackson.date-format(推荐)

1、Spring Boot 提供了三个 JSON 库的集成:Gson、Jackson、JSON-B, 默认使用 jackson (Spring boot 官网文档)。

2、Jackson 是 spring-boot-starter-json 的一部分,提供了 Jackson 的自动配置。Jackson 位于类路径上时,会自动配置 ObjectMapper 对象。提供了多个配置属性用于自定义 ObjectMapper 配置。如果是 Spring boot web 项目,则默认已经依赖了 jackjson,无需再导入(Spring boot 官网文档)。

3、既然请求和响应都需要经过 jackson 进行序列化和反序列化,所以设置日期格式最好的方式就行通过 jackson 属性进行指定(Spring boot 官网)。

4、如果不配置 spring.jackson.time-zone: GMT+8,则Java程序操作Oracle数据库时,入库时间正常,而程序查询的时间会自动少8小时。

  1. # JACKSON (JacksonProperties)
  2. spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.
  3. spring.jackson.default-property-inclusion= # Controls the inclusion of properties during serialization. Configured with one of the values in Jackson's JsonInclude.Include enumeration.
  4. spring.jackson.deserialization.*= # Jackson on/off features that affect the way Java objects are deserialized.
  5. spring.jackson.generator.*= # Jackson on/off features for generators.
  6. spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" is used as a fallback if it is configured with a format string.
  7. spring.jackson.locale= # Locale used for formatting.
  8. spring.jackson.mapper.*= # Jackson general purpose on/off features.
  9. spring.jackson.parser.*= # Jackson on/off features for parsers.
  10. spring.jackson.property-naming-strategy= # One of the constants on Jackson's PropertyNamingStrategy. Can also be a fully-qualified class name of a PropertyNamingStrategy subclass.
  11. spring.jackson.serialization.*= # Jackson on/off features that affect the way Java objects are serialized.
  12. spring.jackson.time-zone= # Time zone used when formatting dates. For instance, "America/Los_Angeles" or "GMT+10".
  13. spring.jackson.visibility.*= # Jackson visibility thresholds that can be used to limit which methods (and fields) are auto-detected.

Spring Boot 2.3.5 Reference Documentation

  1. spring:
  2. mvc:
  3. date-format: yyyy-MM-dd HH:mm:ss #指定 spring mvc 应用日期请求参数的格式(低版本).
  4. format:
  5. date-time: yyyy-MM-dd HH:mm:ss #指定 spring mvc 应用日期请求参数的格式(高版本).
  6. jackson:
  7. #指定日期类型序列化与反序列化时的解析格式。即请求和响应的日期格式。优先级高于 spring.mvc.date-format
  8. date-format: yyyy-MM-dd HH:mm:ss
  9. # 设置日期格式时使用的时区,不设置时可能会出现返回给前端的日期时间自动减少了8个小时。
  10. time-zone: GMT+8

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 中配置即可(官网):

  1. server:
  2. #如果是微服务环境,所有请求需要通过网关转发和返回时,则以下配置需要配置在网关上,而不是目标微服务上
  3. compression:
  4. #是否对响应数据开启gzip压缩,默认false
  5. enabled: true
  6. #响应内容长度超过设置大小时进行压缩,默认值为2048(2KB,不带单位时默认为字节)
  7. min-response-size: 10KB
  8. #对指定的响应类型进行压缩,值是数组,用逗号隔开
  9. 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/503852
推荐阅读
相关标签
  

闽ICP备14008679号