Http请求响应——请求

Http概述

Http协议(HyperText Transfer Protocol,超文本传输协议),是一种用于传输网页数据的协议,规定了浏览器和服务器之间进行数据传输的规则,简单说来就是客户端与服务器端数据交互的数据格式

客户端是需要访问服务器端获取数据的,此时客户端就需要给服务端发送请求,服务端收到请求之后,需要对请求进行处理,然后响应数据。客户端发送请求时,必然是会携带数据的,服务端需要解析这些数据,才能知道该怎么处理、怎么响应。

为了确保客户端和服务器能够正确理解彼此的请求和响应,HTTP 协议规定了数据的格式和传输规则。只有严格遵守这些规范,客户端和服务器才能顺利地完成数据交换。

Http特点

HTTP协议是基于TCP协议的,具有面向连接的特性,这意味着客户端和服务器在通信前需要建立一个连接(三次握手)。由于它基于TCP协议,所以说比某些无连接的协议更加可靠和稳定

Http协议采用的是“请求-响应”模型,客户端发出一个请求后,服务端处理该请求并返回一个响应,每一次请求都对应一次响应

Http协议是无状态的协议,对于事务处理没有记忆的能力,这意味着每一次请求-响应的过程都是独立的,服务端并不会记住上次请求的信息,也无法在多个请求之间共享数据(比如用户登录状态,所以说要使用cookies或者sessions保持状态)。但也正因为其无状态的特点,Http请求响应的速度非常快,因为每个请求都是独立处理的,避免了多次请求之间处理复杂的状态信息。

Http请求

请求数据格式

首先先看一个简单的请求,请求www.baidu.com 然后看看会发生什么:

 这就是请求www.baidu.com 时,浏览器给服务端发送的请求,这样一个请求由三个部分组成:

请求行

请求数据的第一行,其中包含请求方式,请求的资源路径,请求使用的协议及其版本,从上图请求百度可以看出,这次请求是一个get请求(请求数据通过URL直接传递),没有请求的资源,请求使用的是Http协议,版本是1.1。

请求头

从请求数据的第二行开始,以key: value的格式出现。请求头是附加在Http请求中的一些元数据,包含了客户端向服务端发送请求时携带的额外信息。请求头有很多种,可以主要分为:

描述客户端的能力与偏好

请求头可以包含关于客户端(比如浏览器、操作系统、设备)等信息。这些信息可以帮助服务器根据不同的客户端环境做出适应性的响应,提升用户体验,比如:

  • User-Agent:指定客户端软件的类型,比如浏览器的种类、版本。
  • Accept:告诉服务端客户端可以处理的数据格式,比如text/html、application/json等。
  • Accept-Encoding:指定客户端支持的压缩格式,比如gzip、deflate等。
  • Accept-Language:指定客户端希望接收的语言,比如en-US,zh-CN(简体中文)等。
控制请求和响应的缓存行为

请求头可以影响服务端是否使用缓存,以及如何处理缓存Cache-Control可以指定缓存指令,控制服务端的缓存策略,比如no-cache(不使用缓存),max-age-3600等。

身份验证与授权

请求头可以传递身份验证信息,确保客户端有权限访问某些资源(这是十分重要的)Authorization用于传递访问令牌或者凭据(如Bearer token);Cookie用于向服务端发送保存在客户端的cookie信息,通常用于保持会话或者存储用户信息。

定义请求的内容类型

请求头可以告诉服务器请求体中的数据是什么类型,服务器根据这些信息处理请求的数据(Post请求才有)Content-Type用于指定请求体数据的格式,如application/json;Content-Length用于指定请求体的长度(字节数),可以告诉服务器数据的大小。

控制请求的跨域行为

请求头也用于控制跨域请求Origin用于指定发起请求的源(即协议、域名、端口),服务端可以根据信息决定是否允许跨域请求。

常用的请求头

Host:请求的主机名,如:localhost:8080(Tomcat服务器的默认端口号)。

Connection:管理连接,比如keep-alive表示保持连接。

User-Agent:发起请求的浏览器版本;例如:Chrome的浏览器标识Mozilla/5.0...Chrome/79 ;IE的浏览器的标识符类似Mozilla/5.0(Windows NT ...) like Gecko。

Accept:表示浏览器能够接收的数据类型,如:Application/json(json),text/*(文本),image/*(图片),*/*表示所有类型。

Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页(zh-CN是中文;EN是英文)。

Accept-Encoding:表示浏览器支持的压缩类型,如:gzip,deflate等。

只有Post方式的请求才有请求体,Get方式请求是没有请求体的 Content-Type:请求主体的数据类型,比如application/json;charset=UTF-8(UTF-8的json数据) Content-Length:请求主体的大小(字节)。

请求体

请求体在请求头的下面,中间使用一个空行分隔,必须要Post请求才有请求体。请求体用于存放Post请求的请求参数(一般是json格式),Post请求的大小是没有限制的。

HttpServletRequest

如上文所示,我们可以看见一次请求的请求数据是十分繁杂的,假如服务端想要操作这些数据并不方便,所以说Web服务器(Tomcat服务器)就对Http协议中的请求数据进行了解析,并将这些数据封装到了HttpServletRequest实体类中,在调用服务端中的Controller方法时,将这个实体类传递给方法,这样,程序员就无需直接对Http协议操作,而是直接操作解析之后的数据,开发效率提高。

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 通过Tomcat封装的HttpServletRequest对象操作请求数据*/
@RestController
public class RequestController {/*** 通过Tomcat封装的HttpServletRequest对象操作请求数据* @param request HttpServletRequest对象*/@RequestMapping("/request")public String request(HttpServletRequest request) {// 1.获取请求参数(假如说参数有name和age)String name = request.getParameter("name"); // 需要传入参数名即可String age = request.getParameter("age");System.out.println("name=" + name + " age=" + age);// 2.获取请求路径uri和url     url是完整的请求路径 uri是资源的访问路径String uri = request.getRequestURI();String url = request.getRequestURL().toString(); // 原始的类型是StringBuffer,需要使用toString方法转换为String// 3.获取请求头     User-AgentString userAgent = request.getHeader("User-Agent");System.out.println("userAgent = " + userAgent);// 4.获取请求方式String method = request.getMethod();System.out.println("请求方式是" + method);// 5.获取请求协议String protocol = request.getProtocol();System.out.println("请求协议是" + protocol);// 6.获取请求的查询字符串String queryString = request.getQueryString();System.out.println("请求的查询字符串是" + queryString);return "OK";}
}

从浏览器发送请求http://localhost:8080/request?name=tom&age=18,观察控制台输出:

成功使用Tomcat封装的HttpServletRequest实体类获取了请求数据。

 

 

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

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

相关文章

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中,我们至少掌握了两种方法,可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现,相关学习链接为: python学opencv|读取图像(三)放大和缩小图像_python opencv 读取图…

windows中,git bash 使用conda命令

1、首先在Anaconda的安装路径如/Anaconda3/Scripts下,打开git bash窗口,然后输入下面的命令。 ./conda init bash 运行之后,会在用户目录下面生成.bash_profile文件,文件内容如下: # >>> conda initialize…

封装红黑树实现map和set

本博客需要红黑树和搜索树二叉树的一些知识以及熟悉map和set的相关函数和迭代器,如果读者还不熟悉可以看这三篇博客:红黑树、二叉搜索树、map、set的使用 红黑树的封装 STL30源码分析 如果想到封装,大家应该会直接把RBtree复制两份&#x…

关于使用FastGPT 摸索的QA

近期在通过fastGPT,创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上,可以定义业务逻辑,满足输出对话之外的需求。 在最近3个月来的摸索和实践中,一些基于经验的小问题点(自己也常常…

LeetCode 热题 100_二叉树的最近公共祖先(48_236_中等_C++)(二叉树;深度优先搜索)

LeetCode 热题 100_二叉树的最近公共祖先(48_236) 题目描述:输入输出样例:题解:解题思路:思路一(深度优先搜索): 代码实现代码实现(思路一(深度优…

HTTP/HTTPS ②-Cookie || Session || HTTP报头

这里是Themberfue 上篇文章介绍了HTTP报头的首行信息 本篇我们将更进一步讲解HTTP报头键值对的含义~~~ ❤️❤️❤️❤️ 报头Header ✨再上一篇的学习中,我们了解了HTTP的报头主要是通过键值对的结构存储和表达信息的;我们已经了解了首行的HTTP方法和UR…

PyCharm+RobotFramework框架实现UDS自动化测试——(二)RobotFramework环境配置

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 文章目录 1.环境准配2.Pycharm中相关配置2.1. 安装Hyper RobotFramework Support 3.脚本执行环境3.1 执行单条的配置3.2 执行全部用例配置 4.工程运行4.1 单条用例运行4.…

git 转移文件夹

打开终端或命令行界面:首先,确保你的电脑上安装了 Git,并打开终端或命令行界面。 导航到你的仓库目录:使用 cd 命令来切换到包含你想要移动文件夹的仓库的目录。 cd /path/to/your/repository使用 git mv 命令移动文件夹&#x…

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下,注意:socket 接收信息需要异步运行: // port 端口号自定义一个值,比如 8888,但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…

腾讯云AI代码助手编程挑战赛-算法小助手

作品简介 一个可以帮助学习计算机各种算法的AI小助手,提升工作效率。 技术架构 使用Html语言完成图形化页面的样式,使用JavaScript语言来操作对应的逻辑代码。 实现过程 1、创建一个界面 2、获取数据 3、添加按钮与功能 4、程序优化调试 开发环境…

使用 IntelliJ IDEA 创建简单的 Java Web 项目

以下是使用 IntelliJ IDEA 创建几个简单的 Java Web 项目的步骤,每个项目实现基本的登录、注册和查看列表功能,依赖 Servlet/JSP 和基本的 Java Web 开发。 前置准备 确保安装了 IntelliJ IDEA Ultimate(社区版不支持 Web 应用)。…

抓包工具之mitmproxy

一、mitmproxy简介 mitmproxy介绍 mitmproxy又名中间人攻击代理,是一个抓包工具,类似于WireShark、Filddler,并且它支持抓取HTTP和HTTPS协议的数据包,只不过它是一个控制台的形式操作。另外,它还有两个非常有用的组件…

Flutter项目开发模版,开箱即用(Plus版本)

前言 当前案例 Flutter SDK版本:3.22.2 本文,是由这两篇文章 结合产出,所以非常建议大家,先看完这两篇: Flutter项目开发模版: 主要内容:MVVM设计模式及内存泄漏处理,涉及Model、…

rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库

问题说明: 客户反馈 ,buildroot 系统 ,使用qt 使用sqlite ,有报错,无法使用sqlite. 测试情况说明: 我自己测试,发现, buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…

嵌入式系统 tensorflow

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow:机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…

投机解码论文阅读:Falcon

题目:Falcon: Faster and Parallel Inference of Large Language Models through Enhanced Semi-Autoregressive Drafting and Custom-Designed Decoding Tree 地址:https://arxiv.org/pdf/2412.12639 一看它的架构图,可以发现它是基于EAGLE…

鸿蒙UI(ArkUI-方舟UI框架)

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能&#xff…

《探索 PC 端的开源神经网络多模态模型宝藏》

《探索 PC 端的开源神经网络多模态模型宝藏》 一、多模态模型:开启智能交互新纪元二、主流 PC 端开源多模态模型大赏1. Obsidian:轻量级多模态先锋2. GLM-Edge 系列:移动端与 PC 端的全能选手3. Minicpm-llama3-v2.6:紧凑高效的多…

二次雷达的详细介绍及代码示例

一、二次雷达的工作原理 二次雷达,又称空管雷达信标系统(Air Traffic Control Radar Beacon System,ATCRBS),是一种无线电电子测位和辨认系统。它由地面询问雷达和飞机上的应答雷达(又称雷达信标&#xff0…

Clojure语言的多线程编程

Clojure语言的多线程编程 在现代软件开发中,多线程编程是一项重要的技能。它使程序能够在同一时间执行多个任务,充分利用多核处理器的性能。在众多编程语言中,Clojure作为一门函数式编程语言,提供了强大的并发支持。本文将深入探…