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-Agent
        String 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实体类获取了请求数据。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025域名出售交易平台PHP源码

源码介绍 2025域名出售交易平台PHP源码,搭建即可正常使用,后台功能测试正常,前台测试正常,无需到处找教程或修复,教程一次性到位 搭建教程 PHP必须是5.6的 导入数据库 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户&am…

Microsoft Azure Cosmos DB:全球分布式、多模型数据库服务

目录 前言1. Azure Cosmos DB 简介1.1 什么是 Azure Cosmos DB?1.2 核心技术特点 2. 数据模型与 API 支持2.1 文档存储(Document Store)2.2 图数据库(Graph DBMS)2.3 键值存储(Key-Value Store)…

后端技术选型 sa-token校验学习 上 登录校验复习

sa-token 的官网 Sa-Token 复习 首先我们要明确一下 cookie 是什么 登录校验 Sa-Token 官方文档里面的 对于一些登录之后才能访问的接口(例如:查询我的账号资料),我们通常的做法是增加一层接口校验: 如果校验通过…

【教程】Unity 本地化多语种 | Localization 工具组

开发平台:Unity 6.0 编程平台:Visual Studio 2022 编程语言:CSharp 6.0 工具包类:Localization   一、前言 本地化多语言类型是软件面向国际化所必须的功能项。Unity 在 2022 版本后推出 Localization 工具包,以降低…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路:分段 Hermite 插值多项式的构造:MATLAB 实现代码:结果如图:注归一化变量的作用&#x…

Elasticsearch:优化的标量量化 - 更好的二进制量化

作者:来自 Elastic Benjamin Trent 在这里,我们解释了 Elasticsearch 中的优化标量量化以及如何使用它来改进更好的二进制量化 (Better Binary Quantization - BBQ)。 我们的全新改进版二进制量化 (Better Binary Quantization - BBQ) 索引现在变得更强大…

【数据库】六、数据库设计

文章目录 六、数据库设计1 数据库设计步骤1.1 规划阶段1.2 需求分析1.3 概念设计阶段(重点)1.4 逻辑设计阶段(重点)1.5 物理设计阶段1.6 数据库的实现1.7 数据库运行与维护 2 概念模型设计2.1 ER模型2.1.1 ER模型的基本元素2.1.2 联系的设计2.1.3 采用ER模型的概念设计2.1.4 ER…

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制

文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中,页面跳转时, onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明: 1. 页面跳转方式 微信小程序提供了多种页面…

51c~Pytorch~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12311033 一、Pytorch~训练-使用 这里介绍了Pytorch中已经训练好的模型如何使用 Pytorch中提供了很多已经在ImageNet数据集上训练好的模型了,可以直接被加载到模型中进行预测任务。预训练模型存放在Pytorch的…

深度学习的原理和应用

一、深度学习的原理 深度学习是机器学习领域的一个重要分支,其原理基于多层神经网络结构和优化算法。以下是深度学习的核心原理: 多层神经网络结构:深度学习模型通常由多层神经元组成,这些神经元通过权重和偏置相互连接。输入数据…

基于人工智能的公司logo设计生成方法

随着科技的飞速发展,人工智能(AI)已经深入到我们生活的方方面面。其中,基于AI的公司logo设计生成方法,不仅为品牌形象的塑造提供了新的思路,也为企业带来了前所未有的设计体验。本文将详细探讨这一新兴的、…

BO-CNN-BiLSTM-Multihead-Attention,贝叶斯优化CNN-BiLSTM融合多头注意力机制多变量回归预测

BO-CNN-BiLSTM-Multihead-Attention,贝叶斯优化CNN-BiLSTM融合多头注意力机制多变量回归预测 目录 BO-CNN-BiLSTM-Multihead-Attention,贝叶斯优化CNN-BiLSTM融合多头注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Ma…

WPF系列九:图形控件EllipseGeometry

简介 EllipseGeometry用于绘制一个椭圆的形状。它通常与其他图形元素结合使用,比如 Path 或者作为剪切区域来定义其他元素的外形。 定义椭圆:EllipseGeometry 用来定义一个椭圆或者圆的几何形状。参与绘制:可以被用作 Path 元素的数据&…

ue5动画重定向,一键重定向。ue4小白人替换成ue5

这就是我们下载的 初学者动画内容包 点击设置选中列 绿色的是动画 黄色的关卡 蓝色是蓝图 ctrla 全选 ctrl鼠标左键 选中所有动画 重定向动画资产 不要选错,只要绿色 选择目标网格体 选择所有的绿色 动画 导出动画 添加前缀ycn 导出 一定要提前新建好存放的…

服务器漏洞修复解决方案

漏洞1、远程桌面授权服务启用检测【原理扫描】 Windows Remote Desktop Licensing Service is running: Get Server version: 0x60000604 1、解决方案:建议禁用相关服务避免目标被利用 方法一:使用服务管理器 打开“运行”对话框(WinR&am…

uniapp 微信小程序内嵌h5实时通信

描述: 小程序webview内嵌的h5需要向小程序实时发送消息,有人说postMessage可以实现,所以试验一下,结果是实现不了实时,只能在特定时机后退、组件销毁、分享时小程序才能接收到信息(小程序为了安全等考虑做了…

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业,其业务范围涵盖证券、期货、资产管理、财富管理等,凭借广泛的业务网络和多元化的金融服务产品,在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

LabVIEW实现动态水球图的方法

水球图是一种直观展示百分比数据的图表,常用于数据监测与展示。LabVIEW 虽不直接支持水球图绘制,但可通过图片控件动态绘制波形,或借助 HTMLCSS 的 Web 控件实现。此外,还可以结合 Python 等第三方工具生成水球图,LabV…

Simulink中的正弦波模块学习【Sine Wave】

Simulink中的正弦波模块学习 Simulink库中的Sine Wave模块 如下图所示为MATLAB Simulink中的正弦波模块 其元器件库位置为Simulink→Sources→Sine Wave 各项设置参数如下, 点击Help可查看详细信息 正弦波的数学表达式为 y A sin ⁡ ( ω x φ ) k y A \sin(\omega x \va…

maven高级(day15)

Maven 是一款构建和管理 Java 项目的工具 分模块设计与开发 所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多 个模块进行开发。 分模块设计我们在进行项目设计阶段,就可以将一个大的项目拆分成若干…