后端Web核心之请求响应

目录

1.概述

2.接收请求

简单参数和实体参数

数组集合参数

日期参数和JSON参数

路径参数

总结

3.返回响应


1.概述

Web请求和响应是HTTP协议中的核心概念,它们是客户端(通常是浏览器)与服务器之间通信的基础。

浏览器发起请求后,由Controller处理再发送响应数据给浏览器。而我们自己写的controller程序,由于不支持tomcat中的java规范,因此tomcat其实是不能识别的,也就不能运行。

但是Tomcat支持servlet,springboot底层提供了一个非常核心的servlet,就是dispatcherServlet,它实现了servlet接口,那么前端发起的请求都会先经过它,再由它把这个请求转发给各个controller程序,controller处理后的结果再返回给dispatcherServlet,再发送给浏览器。它非常重要,因此叫做前端(核心)控制器

tomcat解析完浏览器的http请求,会封装在HttpServletRequest对象中,而发送的请求会封装在HttpServletResponse对象中。

这种架构模式就叫做BS(browser/server)架构:客户端只需要浏览器,应用程序的逻辑操作和数据都存储在服务端。通过浏览器访问的网站都是BS架构,比如京东、淘宝等

另外一种模式叫做CS(client/server)架构:就是需要安装的客户端,比如QQ、微信等

以上是Web应用程序整体的访问流程,大部分都不需要我们去管,因此要重点关注需要我们自己编写的Controller程序,其中最重要的就是获取请求参数设置响应数据

2.接收请求

简单参数和实体参数

由于通过localhost我们只能发送get请求,如果要发送post或其他形式的请求就需要去编写前端程序,这样是比较繁琐的,因此我们用postman(Apipost、Apifox差不多用法)工具去测试后端的功能接口,它可以指定请求形式、传递参数、请求头和请求体等。

**简单参数:**对于简单参数,无论是什么请求形式,只需要保证请求的参数名和controller方法中的形参名保持一致就都可以接收成功。

即使不一致,也可以通过注解@RequestParam将参数名name映射到username上,从而完成参数的接收。

**实体参数:**简单参数在少的情况下比较方便,但如果要传递十几二十个参数呢,此时就会变得很麻烦,因此考虑把这些参数都封装到一个实体类中,传递这个实体类即可。

以上是简单实体参数的封装,对于对象中含有多个属性(复杂实体参数)的,通过address.privince这样的方式一个一个进行封装。

数组集合参数

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

另一种方式是使用集合参数:用注解RequestParam绑定参数关系

日期参数和JSON参数

日期参数: 用注解DateTimeFormat注解完成日期参数格式转换(指定日期的格式)

**JSON参数:**JSON数据是放在请求体中携带到服务端的,因此要用post请求。JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识

路径参数

通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数,其中id是动态的,以便于访问不同的路径。

对于多个路径参数,就多写一个参数就可以了。

总结

3.返回响应

实际上,return的这部分(hello world)就是响应数据。这依赖于一个核心注解ResponseBody,它被包含在RestController中

这些Controller中的public对外暴露的方法被称为功能接口,RequestMapping后面就是它的请求路径(/hello)。而实际项目开发需要的开发文档 就是描述这些接口的请求路径、请求参数和响应数据。

但是,这些接口的返回的数据多种多样,前端不可能一个一个的对这些数据进行解析。因此我们用一个通用的实体对象(result)来接收,最后所有的Controller方法都给前端返回这个result。这样前端只需要对这种格式的数据进行解析就可以。

相关推荐
蜗牛^^O^27 分钟前
Docker和K8S
java·docker·kubernetes
从心归零1 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe3 小时前
分布式系统实战经验
java·分布式
是梦终空3 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss3 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸3 小时前
flink doris批量sink
java·前端·flink
工业互联网专业4 小时前
毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
Monodye4 小时前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构