web后端开发--请求响应

目录

前言

请求

简单参数

原始方法

Spring方式

Post请求乱码处理

实体参数

简单实体参数

复杂实体参数

​编辑

数组集合参数

数组参数

​编辑

集合参数

日期参数

​编辑

Json参数

​编辑

传递json数据

json数组

json对象(POJO)

json集合(POJO)

注意

路径参数

请求映射路径

@RequestMapping

请求参数

响应

@ResponseBody

统一响应结果


前言

请求:获取请求数据

响应:设置响应数据

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

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

请求

简单参数

原始方法

通过HttpServletRequest手动获取

java 复制代码
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){  //返回的字符串类型是String
        String name=request.getParameter("name");
        String age=request.getParameter("age");  //通过这个方法得到字符串类型的
        int age1=Integer.parseInt(age);  //将年龄进行类型转换
        System.out.println(name+":"+age1);  //设置返回格式
        return "OK";
    }
}

Spring方式

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

java 复制代码
@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包中提供了专用的字符过滤器

java 复制代码
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[]{"/"};
    }
    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};//如果有多个过滤器,在这里用,隔开
    }
}

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

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

java 复制代码
@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接收即可

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

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

复杂实体参数

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

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

数组集合参数

数组参数

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

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

集合参数

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

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

日期参数

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

java 复制代码
@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";
    }
}

java 复制代码
//日期参数    
//使用@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标识

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

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

传递json数据

先导入坐标

java 复制代码
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>

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

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

java 复制代码
{
    "name":"xixi",
    "age":21,
    "address":{
        "provice":"taiyuan",
        "city":"taiyuan"
    }
}
json集合(POJO)
java 复制代码
//集合参数: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请求的时候:

java 复制代码
[{"name":"xixi","age":12},
{"name":"haha","age":21}
]
注意

路径参数

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

一个路径参数

java 复制代码
@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

多个路径参数

java 复制代码
@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控制器方法定义上方

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

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

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

请求参数

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

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

响应

@ResponseBody

是方法注解和类注解

位于controller方法上/类上

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

@RestController=@Controller+@ResponseBody

java 复制代码
@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即可,其他类似

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

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

统一响应结果

java 复制代码
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);
    }
    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
java 复制代码
@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);
    }
}
相关推荐
weixin_382395237 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__8 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.8 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~9 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华10 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子12 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅12 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni13 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学14 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端