web后端开发--请求响应

news2024/11/14 14:28:30

目录

前言

请求

简单参数

原始方法

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){  //返回的字符串类型是String
        String 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[]{"/"};
    }
    //乱码处理
    @Override
    protected 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")
    @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)
//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")
    @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

@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);
    }
    @Override
    public 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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

conda篇----在已有conda环境的基础上升级python包

conda篇----在已有conda环境的基础上升级python包 原先的python版本 第一步&#xff1a; conda update --all(py11) [xxxaivrs01 xxx]$ conda update --all Collecting package metadata (current_repodata.json): done Solving environment: done> WARNING: A newer vers…

PTC可复位保险丝 vs 传统型保险丝:全面对比分析

PTC可复位保险丝&#xff0c;又称为自恢复保险丝、自恢复熔断器或PPTC保险丝&#xff0c;是一种电子保护器件。它利用材料的正温度系数效应&#xff0c;即电阻值随温度升高而显著增加的特性&#xff0c;来实现电路保护。 当电路正常工作时&#xff0c;PTC保险丝呈现低阻态&…

可理解性评估:使用Google Gemini优化语音识别的意义保留

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

从零开始实现大语言模型(三):Token Embedding与位置编码

1. 前言 Embedding是深度学习领域一种常用的类别特征数值化方法。在自然语言处理领域&#xff0c;Embedding用于将对自然语言文本做tokenization后得到的tokens映射成实数域上的向量。 本文介绍Embedding的基本原理&#xff0c;将训练大语言模型文本数据对应的tokens转换成Em…

MongoDB - 集合和文档的增删改查操作

文章目录 1. MongoDB 运行命令2. MongoDB CRUD操作1. 新增文档1. 新增单个文档 insertOne2. 批量新增文档 insertMany 2. 查询文档1. 查询所有文档2. 指定相等条件3. 使用查询操作符指定条件4. 指定逻辑操作符 (AND / OR) 3. 更新文档1. 更新操作符语法2. 更新单个文档 updateO…

【AI前沿】深度学习:神经网络基础

文章目录 &#x1f4d1;引言一、神经元和感知器1.1 神经元的基本概念1.2 感知器模型 二、多层感知器&#xff08;MLP&#xff09;2.1 MLP的基本结构2.2 激活函数的重要性2.3 激活函数2.4 激活函数的选择 三、小结 &#x1f4d1;引言 深度学习是现代人工智能的核心技术之一&…

p12初步认识c语言

1.初识c语言 什么是c语言 c语言是一门计算机语言 计算机语言是什么 人和计算机交流语言 c/c/JAVA/python 语言发展&#xff1a; 二进制语言 硬件-电-正电/负电 1010001010101010101010101010手册 科学家 1010100010-ADD -助记符-汇编语言 B语言 C语言 C、---高级…

【全面介绍语言模型的原理,实战和评估】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🥂语言模型的原理 🥂语言模型基于统计和机器学习的原理,目标…

实验1 —— 安全策略的练习

实验拓扑图 实验要求 1.DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问&#xff1b; 2.生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3.办公区…

Java protobuf序列化

Protobuf概述 Protobuf&#xff08;全称&#xff1a;Protocol Buffers&#xff09;是由 Google 开发的一种语言中立、平台无关、可扩展的序列化协议。它用于高效地结构化数据的序列化和反序列化。Protobuf 的主要特点是其紧凑、高效和可扩展的编码格式&#xff0c;使其在各种网…

Nginx中文URL请求404

这两天正在搞我的静态网站。方案是&#xff1a;从思源笔记Markdown笔记&#xff0c;用MkOcs build成静态网站&#xff0c;上传到到Nginx服务器。遇到一个问题&#xff1a;URL含有中文会404&#xff0c;全英文URL则正常访问。 ‍ 比如&#xff1a; ​​ ‍ 设置了utf-8 ht…

mac安装配置cmake

本机是2015 macbook pro mid&#xff0c;已经有点老了&#xff0c;用homebrew下cmake老出问题 其实cmake官网安装也不麻烦 一、官网下载对应安装包 Download CMake 和所有dmg文件一样安装 二、改成命令行使用 一般来说 tutorial 给的都是命令行build 命令行的设置如下&am…

React Hooks学习笔记

一、usestate的使用方法-初始化state函数 import React, { useState } from "react"; function App() {const [count, setCount] useState(0);return (<div><p>点击{count}次</p><button onClick{() > setCount(count 1)}>点击</bu…

【TAROT学习日记】韦特体系塔罗牌学习(1)——愚者 THE FOOL 0

韦特体系塔罗牌学习&#xff08;1&#xff09;——愚者 THE FOOL 0 https://www.tarotchina.net/major-arcana0-vip/ 目录 韦特体系塔罗牌学习&#xff08;1&#xff09;——愚者 THE FOOL 0牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际关…

原生小程序生成二维码并保存到本地

需求&#xff1a;我要在一个页面中生成一个二维码&#xff0c;并且这个二维码可以长按保存到本地或者发送给好友&#xff1b; 我这里是将生成的canvas二维码转换成图片&#xff0c;利用长按图片进行保存或转发 效果图&#xff1a; 第一步先下载对应的包&#xff1a; npm instal…

Web3知识图谱,一篇读完

这张图展示了区块链生态系统的架构和主要组件。以下是对图中内容的概括总结&#xff1a; 基础层&#xff1a; 底层基础设施&#xff1a;包括光纤网络、P2P网络、非对称加密、哈希算法、默克尔树和随机数生成。共识机制&#xff1a; PoW&#xff08;工作量证明&#xff09;: 比特…

C语言笔记31 •单链表经典算法OJ题-3.反转链表•

反转链表 1.问题 给你单链表的头节点 head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.代码实现&#xff1a; //3.反转链表 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int …

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名&#xff1a;admin 默认密码&#xff1a;Admin123 修改密码 然后他会提示你是否要修改密码&#xff0c;想改就改不想改就不改 进入命令行界面 进入系统视图开启web…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…

商业合作方案撰写指南:让你的提案脱颖而出的秘诀

作为一名策划人&#xff0c;撰写一份商业合作方案需要细致的规划和清晰的表达。 它是一个综合性的过程&#xff0c;需要策划人具备市场洞察力、分析能力和创意思维。 以下是能够帮助你撰写一份有效的商业合作方案的关键步骤和要点&#xff1a; 明确合作目标&#xff1a;设定…