当前位置: 首页 > news >正文

web后端开发--请求响应

目录

前言

请求

简单参数

原始方法

Spring方式

Post请求乱码处理

实体参数

简单实体参数

复杂实体参数

​编辑

数组集合参数

数组参数

​编辑

集合参数

日期参数

​编辑

Json参数

​编辑

传递json数据

json数组

json对象(POJO)

json集合(POJO)

注意

路径参数

请求映射路径

@RequestMapping

请求参数

响应

@ResponseBody

统一响应结果


前言

请求:获取请求数据

响应:设置响应数据

BS架构 Browser/Server,浏览器/服务器架构模式,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端(维护方便,体验一般

CS架构 Client/Server,客户端/服务器架构模式(开发维护麻烦,体验不错

请求

简单参数

原始方法

通过HttpServletRequest手动获取

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {@RequestMapping("/SimpleParam")public String SimpleParam(HttpServletRequest request){  //返回的字符串类型是StringString name=request.getParameter("name");String age=request.getParameter("age");  //通过这个方法得到字符串类型的int age1=Integer.parseInt(age);  //将年龄进行类型转换System.out.println(name+":"+age1);  //设置返回格式return "OK";}
}

Spring方式

简单参数:参数名与形参变量名相同,定义形参即接收参数

@RestController
public class RequestController {@RequestMapping("/SimpleParam")public String SimpleParam(String name,Integer age){System.out.println(name+":"+age);return "OK";}
}

注意这里的postman的网址均为http://localhost:8080/SimpleParam?name=tom&age=10

以上两种均为get请求,当为post请求时只需要在postman中网址输入http://localhost:8080/SimpleParam

Post请求乱码处理

如果post里面有汉字传进去,后台会出现乱码所以在配置那里设置过滤器

为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[0];}
​protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}
​protected String[] getServletMappings() {return new String[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};//如果有多个过滤器,在这里用,隔开}
}

注意这个处理的是post的,如果get传入中文依旧会出现乱码

如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射

@RestController
public class RequestController {@RequestMapping("/SimpleParam")public String SimpleParam(@RequestParam(name="name") String username, Integer age){  //引号中写的是请求参数名System.out.println(username+":"+age);return "OK";}
}

@PequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递,将会报错,如果该参数是可选的(也就是可以传递可以不传递),可以将required属性设置为false(这样你传或者不传都不会报错)

实体参数

简单实体参数

请求参数名与形参属性名相同,定义Pojo接收即可

@RestController
public class SimplePojo {@RequestMapping("/SimpleParam1")public String SimplePojo(user user) {System.out.println(user);return "yes";}
}
public class user {private String name;private Integer age;
//加getter和setter方法toString
} 

这里的url是http://localhost:8080/SimpleParam1?name=cat&age=29

复杂实体参数

请求参数名与形参属性名相同,按照对象层次结构关系即可接收嵌套pojo属性参数

public class user {private String name;private Integer age;
private Address address;
//加getter和setter和toString
}
public class Address {private String province;private String city;
//加getter和setter还有toString
}
@RestController
public class SimplePojo {@RequestMapping("/ComplexParam1")public String ComplexParam(user user) {System.out.println(user);return "yes";}
}

数组集合参数

数组参数

请求参数名与形参数组名称相同且请求为多个,定义数组类型形参即可接收参数

@RestController
public class SimplePojo {@RequestMapping("/arrayParam")public String ArrayParam(String[] hobby) {//在这里建立一个数组,然后后面的名称和传入参数相同System.out.println(Arrays.toString(hobby));return "yes";}
}

集合参数

请求参数名与形参集合名称相同且请求参数为多个@RequestParam绑定参数关系

@RestController
public class SimplePojo {@RequestMapping("/listParam")public String ArrayParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "yes";}
}

日期参数

使用@DateTimeFormat注解完成日期参数格式转换

@RestController
public class SimplePojo {@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {System.out.println(updateTime);return "yes";}
}

//日期参数    
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd   @RequestMapping("/dataParam")    
@ResponseBody    
public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){        
System.out.println("参数传递 date ==> "+date);        
System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);        
System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);        
return "{'module':'data param'}";    }
}
//@DateTimeFormat是形参注解,用在SpringMVC控制器方法形参前面,用于设定日期时间型数据格式//属性:pattern:日期时间格式字符串

Get测试:

http://localhost:8080/springmvc_04_request_param/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08

Json参数

json参数键名与形参对象属性名相同,定义Pojo类型形参即可接收参数,需要使用@RequestBody标识

@RestController
public class SimplePojo {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody user user) {System.out.println(user);return "yes";}
}
//user这和前面的复杂实体参数一样

通过@requestbody将json封装到user这个实体类之中

传递json数据

先导入坐标

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>

开启自动转换Json数据的支持

@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
json数组
   
//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
//它用来将请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次@RequestMapping("/listParamForJson")@ResponseBodypublic String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> "+likes);return "{'module':'list common for json param'}";}
json对象(POJO)
//POJO参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> "+user);return "{'module':'pojo for json param'}";
}

Get请求的时候:

{"name":"xixi","age":21,"address":{"provice":"taiyuan","city":"taiyuan"}
}
json集合(POJO)
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> "+list);return "{'module':'list pojo for json param'}";
}

Get请求的时候:

[{"name":"xixi","age":12},
{"name":"haha","age":21}
]
注意

路径参数

通过请求url直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数

一个路径参数

@RestController
public class SimplePojo {@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "yes";}
}

postman测试的url为http://localhost:8080/path/1

多个路径参数

@RestController
public class SimplePojo {@RequestMapping("/path/{id}/{name}")public String pathParam(@PathVariable Integer id ,@PathVariable String name) {System.out.println(id+":"+name);return "yes";}
}

 postman测试的url为http://localhost:8080/path/1/cat

请求映射路径

问题的提出:在开发中请求的路径应该是不同的,但是如果有相同的路径就会报错,不知道到底应该调用哪一个----------通常通过设置模块名作为请求路径的前缀

@RequestMapping

他是方法注解和类注解

放在SpringMVC控制器方法定义上方

用于设置控制器方法请求路径,如果设置在类上设置当前控制器方法,请求访问路径前缀

@Controller
//设置模块名作为请求路径的前缀
@RequestMapping("/user")
public class UserController {//请求路径映射@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}//请求路径映射@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("user delete ...");return "{'module':'user delete'}";}
​
}

属性:value(默认):请求访问路径。或者访问路径前缀

请求参数

@RequestParam是形参注解,位于SpringMVC控制器方法形参定义前面,用于绑定请求参数与处理器方法形参之间的关系

参数:required:是否为必传参数 DefaultValue:参数默认值

响应

@ResponseBody

是方法注解和类注解

位于controller方法上/类上

作用是将方法返回值直接响应,如果返回值类型是 实体对象/集合,竟会转换为JSON格式响应

@RestController=@Controller+@ResponseBody

@RestController
public class ResponseController {@RequestMapping("/hello")public String hello(){System.out.println("hello world");return "hello world~";}@RequestMapping("/getAddr")public Address getAddr(){Address addr=new Address();addr.setProvince("山西");addr.setCity("太原");return addr;}@RequestMapping("/listAddr")public List<Address> ListAddr(){List<Address> list=new ArrayList<>();Address addr=new Address();addr.setProvince("山西");addr.setCity("太原");Address addr2=new Address();addr2.setProvince("山");addr2.setCity("太");list.add(addr);list.add(addr2);return list;}
}

测试是在postman输入http://localhost:8080/listAddr即可,其他类似

每一个对外暴露的方法都称为一个功能接口(比如上面就有三个接口),路径就是他们的访问路径

面临的问题是他们的响应结果不同,最后解析结果较为麻烦,所以需要统一响应结果

统一响应结果

public class Result {private Integer code;private String msg;private Object data;
public Result(){}
public Result(Integer code,String msg,Object data){this.code=code;this.msg=msg;this.data=data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success(Object data){return new Result(1,"success",data);}public static Result success(){return new Result(1,"success",null);}public static Result error(String msg){return new Result(0,msg,null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}
@RestController
public class ResponseController {@RequestMapping("/hello")public Result hello(){System.out.println("hello world");//return new Result(1,"success","hello world");return Result.success("hello world~");//需要给前端传送数据}@RequestMapping("/getAddr")public Result getAddr(){Address addr=new Address();addr.setProvince("山西");addr.setCity("太原");return Result.success(addr);}@RequestMapping("/listAddr")public Result ListAddr(){List<Address> list=new ArrayList<>();Address addr=new Address();addr.setProvince("山西");addr.setCity("太原");Address addr2=new Address();addr2.setProvince("山");addr2.setCity("太");list.add(addr);list.add(addr2);return Result.success(list);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成
  • 阿里云ecs服务器,nginx多域名多项目部署教程,含本地部署教程
  • pytest使用报错(以及解决pytest所谓的“抑制print输出”)
  • 在AvaotaA1全志T527开发板上使用AvaotaOS 部署 Docker 服务
  • 使用Ultralytics YOLO进行模型验证
  • 测试狗:“微观结构表征+理论计算”助力《Science》论文发表
  • 双向链表 -- 详细理解和实现
  • 51单片机(STC8051U34K64)_RA8889_SPI4参考代码(v1.3)
  • VIM模式之间的切换
  • 深圳比创达|EMC与EMI测试整改:打造电磁“绿色”产品的必经之路4
  • virturalBox+K8S部署jaeger-all-in-one
  • CentOS 6.5配置国内在线yum源和制作openssh 9.8p1 rpm包 —— 筑梦之路
  • 跨域解决方案处理
  • 【Linux网络】IP协议{初识/报头/分片/网段划分/子网掩码/私网公网IP/认识网络世界/路由表}
  • HTTP-概述
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • php面试题 汇集2
  • Spring Boot MyBatis配置多种数据库
  • spring boot 整合mybatis 无法输出sql的问题
  • tensorflow学习笔记3——MNIST应用篇
  • Theano - 导数
  • 给github项目添加CI badge
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 入手阿里云新服务器的部署NODE
  • 三分钟教你同步 Visual Studio Code 设置
  • 详解NodeJs流之一
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 2017年360最后一道编程题
  • ionic异常记录
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # Redis 入门到精通(七)-- redis 删除策略
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $.ajax()方法详解
  • (1)Android开发优化---------UI优化
  • (12)Linux 常见的三种进程状态
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (void) (_x == _y)的作用
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (自用)交互协议设计——protobuf序列化
  • .Net core 6.0 升8.0
  • .Net Core缓存组件(MemoryCache)源码解析
  • .sdf和.msp文件读取
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • ?
  • @Autowired自动装配
  • @media screen 针对不同移动设备
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945