请求与响应以及REST风格

目录

  • 请求与响应
    • 请求参数
      • 参数传递
    • 五种类型参数传递
      • 普通参数
      • POJO数据类型
      • 嵌套POJO类型参数
      • 数组类型参数
      • 集合类型参数
    • JSON数据传输参数
      • JSON普通数组
      • JSON对象数据
      • JSON对象数组
      • 知识点1:@EnableWebMvc
      • 知识点2:@RequestBody
      • @RequestBody与@RequestParam区别
      • 日期类型参数传递
      • 知识点1:@DateTimeFormat
    • 响应
      • 返回文本数据[了解]
      • 响应JSON数据
  • REST风格
    • REST简介
    • RESTful入门案例
    • RESTful快速开发

请求与响应

请求参数

参数传递

  1. GET发送单个参数
    发送请求与参数:
    在这里插入图片描述
    接收参数:
    在这里插入图片描述
  2. GET发送多个参数
    发送请求与参数:
    在这里插入图片描述
    接收参数:
    在这里插入图片描述
    GET请求中文乱码
    如果我们传递的参数中有中文,你会发现接收到的参数会出现中文乱码问题。
    发送请求: http://localhost/commonParam?name=张三&age=18
    控制台:
    在这里插入图片描述
    出现乱码的原因相信大家都清楚,Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port><!--tomcat端口号-->
<path>/</path> <!--虚拟目录-->
<uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
</configuration>
</plugin>
</plugins>
</build>
  1. POST发送参数
    发送请求与参数:
    在这里插入图片描述
    接收参数:
    和GET一致,不用做任何修改
    在这里插入图片描述
    POST请求中文乱码
    发送请求与参数:
    在这里插入图片描述
    接收参数:
    控制台打印,会发现有中文乱码问题。
    在这里插入图片描述
    解决方案:配置过滤器
    在这里插入图片描述
    CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。

五种类型参数传递

普通参数

普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。
在这里插入图片描述
如果形参与地址参数名不一致该如何解决?
发送请求与参数:
在这里插入图片描述
后台接收参数:
在这里插入图片描述
因为前端给的是name ,后台接收使用的是userName ,两个名称对不上,导致接收数据失败:
在这里插入图片描述
解决方案:使用@RequestParam注解
在这里插入图片描述
注意:写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能

POJO数据类型

简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。
POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
此时需要使用前面准备好的POJO类,先来看下User
在这里插入图片描述
发送请求和参数:
在这里插入图片描述
后台接收参数:
在这里插入图片描述
注意:

  • POJO参数接收,前端GET和POST发送请求数据的方式不变。
  • 请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

嵌套POJO类型参数

如果POJO对象中嵌套了其他的POJO类,如
在这里插入图片描述
嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
发送请求和参数:
在这里插入图片描述
后台接收参数:
在这里插入图片描述
注意:
请求参数key的名称要和POJO中属性的名称一致,否则无法封装

数组类型参数

举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢?
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数
发送请求和参数:
在这里插入图片描述
后台接收参数:
在这里插入图片描述

集合类型参数

数组能接收多个值,那么集合是否也可以实现这个功能呢?
发送请求和参数:
在这里插入图片描述
后台接收参数:
在这里插入图片描述
运行会报错,
在这里插入图片描述
错误的原因是:SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。
解决方案是:使用@RequestParam注解
在这里插入图片描述

  • 集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
  • 对于简单数据类型使用数组会比集合更简单些。
    知识点1:@RequestParam
    在这里插入图片描述

JSON数据传输参数

前面我们说过,现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,所以前端如果发送的是JSON数据,后端该如何接收?
对于JSON数据类型,我们常见的有三种:

  • json普通数组([“value1”,“value2”,“value3”,…])
  • json对象({key1:value1,key2:value2,…})
  • json对象数组([{key1:value1,…},{key2:value2,…}])
    对于上述数据,前端如何发送,后端如何接收?

JSON普通数组

步骤1:pom.xml添加依赖
SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖
在这里插入图片描述
步骤2:PostMan发送JSON数据
在这里插入图片描述
注意:@RequestMapping不限制请求方式,这里我们用的get发送json数据。本质上get和post没有区别,get也可以发送json数据,post也可以发送url参数,只是约定俗称使用get发送url参数,post发送json数据。另外如果使用@GetMapping就只能使用get请求。有关get和post请参考博文。
步骤3:开启SpringMVC注解支持
在SpringMVC的配置类中开启SpringMVC的注解支持,这里面就包含了将JSON转换成对象的功能。
在这里插入图片描述
步骤4:参数前添加@RequestBody
在这里插入图片描述
步骤5:启动运行程序
在这里插入图片描述
JSON普通数组的数据就已经传递完成,下面针对JSON对象数据和JSON对象数组的数据该如何传递呢?

JSON对象数据

我们会发现,只需要关注请求和数据如何发送?后端数据如何接收?
请求和数据的发送:
在这里插入图片描述
在这里插入图片描述
后端接收数据:
在这里插入图片描述
启动程序访问测试
在这里插入图片描述
说明:
address为null的原因是前端没有传递数据给后端。
如果想要address也有数据,我们需求修改前端传递的数据内容:
在这里插入图片描述
再次发送请求,就能看到address中的数据
在这里插入图片描述

JSON对象数组

集合中保存多个POJO该如何实现?
请求和数据的发送:
在这里插入图片描述
在这里插入图片描述
后端接收数据:
在这里插入图片描述
启动程序访问测试
在这里插入图片描述
小结
SpringMVC接收JSON数据的实现步骤为:
(1)导入jackson包
(2)使用PostMan发送JSON数据
(3)开启SpringMVC注解驱动,在配置类上添加@EnableWebMvc注解
(4)Controller方法的参数前添加@RequestBody注解

知识点1:@EnableWebMvc

在这里插入图片描述

知识点2:@RequestBody

在这里插入图片描述

@RequestBody与@RequestParam区别

  • 区别
    • @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
    • @RequestBody用于接收json数据【application/json】
  • 应用
    • 后期开发中,发送json格式数据为主,@RequestBody应用较广
    • 如果发送非json格式数据,选用@RequestParam接收请求参数

日期类型参数传递

日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如:

  • 2088-08-18
  • 2088/08/18
  • 08/18/2088

  • 针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类型数据么?
    步骤1:编写方法接收日期数据
    在UserController类中添加方法,把参数设置为日期类型
    在这里插入图片描述
    步骤2:启动Tomcat服务器
    查看控制台是否报错,如果有错误,先解决错误。
    步骤3:使用PostMan发送请求
    使用PostMan发送GET请求,并设置date参数
    在这里插入图片描述
    步骤4:查看控制台
    在这里插入图片描述
    通过打印,我们发现SpringMVC可以接收日期数据类型,并将其打印在控制台。
    这个时候,我们就想如果把日期参数的格式改成其他的,SpringMVC还能处理么?
    步骤5:更换日期格式
    为了能更好的看到程序运行的结果,我们在方法中多添加一个日期参数
    在这里插入图片描述
    使用PostMan发送请求,携带两个不同的日期格式,
    在这里插入图片描述
    发送请求和数据后,页面会报400,控制台会报出一个错误
    Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2088-08-08'; nested exception is java.lang.IllegalArgumentException]
    从错误信息可以看出,错误的原因是在将2088-08-08 转换成日期类型的时候失败了,原因是
    SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd ,而我们现在传递的不符合其默认格式,
    SpringMVC就无法进行格式转换,所以报错。
    解决方案也比较简单,需要使用@DateTimeFormat
    在这里插入图片描述
    重新启动服务器,重新发送请求测试,SpringMVC就可以正确的进行日期转换了
    在这里插入图片描述
    步骤6:携带时间的日期
    接下来我们再来发送一个携带时间的日期,看下SpringMVC该如何处理?
    先修改UserController类,添加第三个参数
    在这里插入图片描述
    使用PostMan发送请求,携带两个不同的日期格式,
    在这里插入图片描述
    重新启动服务器,重新发送请求测试,SpringMVC就可以将日期时间的数据进行转换
    在这里插入图片描述

知识点1:@DateTimeFormat

在这里插入图片描述
内部实现原理
讲解内部原理之前,我们需要先思考个问题:

  • 前端传递字符串,后端使用日期Date接收
  • 前端传递JSON数据,后端使用对象接收
  • 前端传递字符串,后端使用Integer接收
  • 后台需要的数据类型有很多中
  • 在数据的传递过程中存在很多类型的转换
    问:谁来做这个类型转换?
    答:SpringMVC
    问:SpringMVC是如何实现类型转换的?
    答:SpringMVC中提供了很多类型转换接口和实现类
    在框架中,有一些类型转换接口,其中有:
    (1) Converter接口
    在这里插入图片描述
    注意:Converter所属的包为org.springframework.core.convert.converter
    Converter接口的实现类
    在这里插入图片描述
    框架中有提供很多对应Converter接口的实现类,用来实现不同数据类型之间的转换,如:
    请求参数年龄数据(String→Integer)
    日期格式转换(String → Date)
    (2) HttpMessageConverter接口
    该接口是实现对象与JSON之间的转换工作
    注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略

响应

返回文本数据[了解]

在这里插入图片描述
还不能称作返回json数据,这只是返回字符串。

响应JSON数据

响应POJO对象
在这里插入图片描述
返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖
@ResponseBody注解和@EnableWebMvc注解
知识点1:@ResponseBody
在这里插入图片描述
说明:

  • 该注解可以写在类上或者方法上
  • 写在类上就是该类下的所有方法都有@ReponseBody功能
  • 当方法上有@ReponseBody注解后
    • 方法的返回值为字符串,会将其作为文本内容直接响应给前端
    • 方法的返回值为对象,会将对象转换成JSON响应给前端
      此处又使用到了类型转换,内部还是通过Converter接口的实现类完成的,所以Converter除了前面所说的功能外,它还可以实现:
  • 对象转Json数据(POJO -> json)
  • 集合转Json数据(Collection -> json)

REST风格

REST简介

REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格。
当我们想表示一个网络资源的时候,可以使用两种方式:

  • 传统风格资源描述形式
    • http://localhost/user/getById?id=1查询id为1的用户信息
    • http://localhost/user/saveUser保存用户信息
  • REST风格描述形式
    http://localhost/user/1
    http://localhost/user
    传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为会程序的人读取了你的请求url地址,就大概知道该url实现的是一个什么样的操作。
    查看REST风格的描述,你会发现请求地址变的简单了,并且光看请求URL并不是很能猜出来该URL的具体功能
    所以REST的优点有:
  • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
  • 书写简化
    但是我们的问题也随之而来了,一个相同的url地址即可以是新增也可以是修改或者查询,那么到底我们该如何区分该请求到底是什么操作呢?
  • 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
    在这里插入图片描述
    请求的方式比较多,但是比较常用的就4种,分别是GET , POST , PUT , DELETE。
    按照不同的请求方式代表不同的操作类型。
  • 发送GET请求是用来做查询
  • 发送POST请求是用来做新增
  • 发送PUT请求是用来做修改
  • 发送DELETE请求是用来做删除
    但是注意:
  • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
    • REST提供了对应的架构方式,按照这种架构设计项目可以降低开发的复杂性,提高系统的可伸缩性
    • REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除,但是我们如果非要用GET请求做删除,这点在程序上运行是可以实现的
    • 但是如果绝大多数人都遵循这种风格,你写的代码让别人读起来就有点莫名其妙了。
  • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts…
    清楚了什么是REST风格后,我们后期会经常提到一个概念叫RESTful,那什么又是RESTful呢?
  • 根据REST风格对资源进行访问称为RESTful。
    后期我们在进行开发的过程中,大多是都是遵从REST风格来访问我们的后台服务,所以可以说咱们以后都是基于RESTful来进行开发的。

RESTful入门案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    @GetMapping(path = "/public/ratio/page")public HttpResponseBean<PageBean<RatioResponse>> ratioPage(RatioRequest ratioRequest) {PageBean<RatioResponse> pageInfo = ratioService.getRatioPage(ratioRequest);return HttpResponseBean.ok(pageInfo);}

在这里插入图片描述

 @PostMapping(path = "/public/proportionalResolution")public HttpResponseBean<List<ProportionalResolution>> proportionalResolution(@RequestBody RatioRequest ratioRequest) {List<ProportionalResolution> proportionalResolutionResponse = proportionalResolutionService.findProportionalResolutionByRatio(ratioRequest);return HttpResponseBean.ok(proportionalResolutionResponse);}

RESTful快速开发

  • @Controller + @ResponseBody合并为@RestController放在类上
  • @RequestMapping(value=“/books”,method=RequestMethod.POST),每个方法上都有value=“/books”,抽取@RequestMapping(“/books”)放在类上,这时每个方法上变为@RequestMapping(value = “/books”,method=RequestMethod.POST),等价为@PostMapping(“/books”)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/131980.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SICTF 2023] webmisc

文章目录 webBaby_PHP涉及知识点 我全都要RCE你能跟得上我的speed吗 miscPixel_art攻破这个压缩包&#xff01; web Baby_PHP 涉及知识点 php解析特性apache换行解析漏洞无参RCE 源代码 <?php highlight_file(__FILE__); error_reporting(0);$query $_SERVER[QUERY_ST…

OpenCV Series : Target Box Outline Border

角点 P1 (255, 000, 000) P2 (000, 255, 000) P3 (000, 000, 255) P4 (000, 000, 000)垂直矩形框 rect cv2.minAreaRect(cnt)targetColor roi_colortargetThickness 1targetColor (255, 255, 255)if lineVerbose:if True:cv2.line(ph…

做机器视觉工程师,其实挺没意思的

3.康耐视VisionPro高级脚本系列教程-3.脚本编辑错误和运行错误调试方法&#xff0c;break和Contitinuee的差别_哔哩哔哩_bilibili 其实人生就是“有时有意思&#xff0c;有时没意思”。 心里有太多的不甘心&#xff0c;太多的苦水&#xff0c;是没法再吃学习的苦&#xff0c…

市场调查中的信度和效度分析原理及python实现示例

市场调查中的信度和效度分析 1.量表信度分析1.1 内部一致性信度&#xff1a;克朗巴赫α系数原理1.2 python实现示例 2.量表效度分析2.1 内容效度2.1.1 原理2.1.2 python实现示例 2.2 准则效度2.2.1 原理2.2.2 python实现示例 2.3 结构效度2.3.1 原理2.3.2 python实现示例 3.量表…

[PyTorch][chapter 54][GAN- 1]

前言&#xff1a; GAN playground: Experiment with Generative Adversarial Networks in your browser 生成对抗网络&#xff08;Generative Adversarial Nets&#xff0c;GAN&#xff09;是一种基于对抗学习的深度生成模型&#xff0c;最早由Ian Goodfellow于2014年在《Gener…

selenium.chrome怎么写扩展拦截或转发请求?

Selenium WebDriver 是一组开源 API&#xff0c;用于自动测试 Web 应用程序&#xff0c;利用它可以通过代码来控制chrome浏览器&#xff01; 有时候我们需要mock接口的返回&#xff0c;或者拦截和转发请求&#xff0c;今天就来实现这个功能。 代码已开源&#xff1a; https:/…

使用java连接Libvirtd

基于springboot web 一、依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId>&l…

用c语言编写出三底模型

以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据&#xff0c;判断是否出现三底形态&#xff0c;如果是&#xff0c;则输出买入信号&#xff0c;否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…

Java项目---图片服务器

图片服务器--->服务器&#xff08;图床&#xff09; 核心功能&#xff1a;上传图片、展示图片等 比如&#xff1a;编写博客时我们会插入图片&#xff0c;本质上是往文章中放了一个链接&#xff08;URL&#xff09;&#xff0c;这个URL资源在另外一个服务器上。 核心知识点…

FPGA 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存HDMI输出 5、vivado工程详解PL端FPGA硬件设…

无涯教程-JavaScript - INFO函数

描述 INFO函数返回有关当前操作环境的信息。 语法 INFO (type_text) 争论 Argument描述Required/OptionalType_text 指定要返回的信息类型的文本。 下表给出了Type_text的值和相应的返回信息。 Required Type_text 返回的信息"目录" 当前目录或文件夹的路径。&qu…

【Proteus仿真】【STM32单片机】四驱寻迹避障小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;LCD1602显示红外、超声波检测状态和距离、小车运行状态。可通过K1键可手动切换模式&#xff0c;寻迹、避障、蓝牙遥控&#xff1b;也可通过蓝牙发送指令切换模式&#xff1b; 当处…

系统架构设计之道,论如何构建一个资金账户系统

&#x1f449;导读 资金账户是互联网和金融业务中非常常见的系统&#xff0c;尤其是在电商、支付等业务中必不可少。资金账户系统本身其核心模块的整体架构往往并不复杂&#xff0c;但其对于资金安全和可用性的要求非常高&#xff0c;导致建设好一个资金账户系统并不容易。本文…

【Spring Boot】有这一文就够了

作者简介 前言 作者之前写过一个Spring Boot的系列&#xff0c;包含自动装配原理、MVC、安全、监控、集成数据库、集成Redis、日志、定时任务、异步任务等内容&#xff0c;本文将会一文拉通来总结这所有内容&#xff0c;不骗人&#xff0c;一文快速入门Spring Boot。 专栏地址…

MySQL安装validate_password_policy插件

功能介绍 validate_password_policy 是插件用于验证密码强度的策略。该参数可以设定三种级别&#xff1a;0代表低&#xff0c;1代表中&#xff0c;2代表高。 validate_password_policy 主要影响密码的强度检查级别&#xff1a; 0/LOW&#xff1a;只检查密码长度。 1/MEDIUM&am…

YashanDB:潜心实干,数据库核心技术突破没有捷径可走

都说数据库是三大基础软件中的一块硬骨头&#xff0c;技术门槛高、研发周期长、工程要求高&#xff0c;市场长期被几大巨头所把持。 因此&#xff0c;实现突破一直是中国数据库产业的夙愿。自上个世纪80年代起&#xff0c;中国数据库产业走过艰辛坎坷的四十余载&#xff0c;终…

vue组件库开发,webpack打包,发布npm

做一个像elment-ui一样的vue组件库 那多好啊&#xff01;这是我前几年就想做的 但webpack真的太难用&#xff0c;也许是我功力不够 今天看到一个视频&#xff0c;早上6-13点&#xff0c;终于实现了&#xff0c;呜呜 感谢视频的分享-来龙去脉-大家可以看这个视频&#xff1a;htt…

美东一公司的郁闷面试题

说是题目可以用不同的语言&#xff0c;但是貌似 Java 是多线程的&#xff0c;用 Java 写肯定容易不少。 但&#xff0c;觉得这个题目用多线程简直是有点脱了裤子放屁。 完整题目内容 题目的网站内容如下&#xff1a; Please complete the following challenge in one of th…

【自动驾驶决策规划】POMDP之Introduction

文章目录 前言Markov PropertyMarkov ChainHidden Markov ModelMarkov Decision ProcessPartially Observable Markov Decision ProcessBackground on Solving POMDPsPOMDP Value Iteration Example 推荐阅读与参考 前言 本文是我学习POMDP相关的笔记&#xff0c;由于个人能力…

2024字节跳动校招面试真题汇总及其解答(一)

1. 【算法题】重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:hea…