Http请求响应——请求

news2025/1/11 17:28:26

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

 

 

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

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

相关文章

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

socket网络编程-TC/IP方式

网络编程 1.概念:两台设备之间通过网络数据传输。 2.网络通信:将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。 TCP和UDP TCP协议: 1.使用TCP协…

RabbitMQ基本介绍及简单上手

(一)什么是MQ MQ(message queue)本质上是队列,满足先入先出,只不过队列中存放的内容是消息而已,那什么是消息呢? 消息可以是字符串,json也可以是一些复杂对象 我们应用场…

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…

网络分析与监控:阿里云拨测方案解密

作者:俞嵩(榆松) 随着互联网的蓬勃发展,网络和服务的稳定性已成为社会秩序中不可或缺的一部分。一旦网络和服务发生故障,其带来的后果将波及整个社会、企业和民众的生活质量,造成难以估量的损失。 2020 年 12 月: Ak…

STL——二叉搜索树

目录 二叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 ⼆叉搜索树的删除 中序遍历结果为升序序列 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树 • 若它的左⼦树不为空&#…

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用(运行中的程序)的角度。外部特指文件。 这里的文件是泛指,并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…

VS调试MFC进入系统源代码配置

调试MFC代码有时候能进入MFC的源代码,有时候不能.之前一直没有深入研究.后面经过查资料发现每次调试必能进入源代码的配置.很简单,只需要3步. 1.打开工具->选项->调试->符号,勾选Microsoft符号服务器. 2.打开项目->属性->配置属性->常规,MFC的使用修改成&qu…

车载网络:现代汽车的数字心跳

在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…

mycat介绍与操作步骤

文章目录 1.分库分表2.mycat 入门2.1 概述2.2 案例:水平分表1)准备工作2)配置3)启动并测试 3.mycat 配置详解3.1 schema.xml3.2 rule.xml3.3 server.xml 4.mycat 分片:垂直拆分1)准备工作2)配置…

【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!

这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本脚本执行结果常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo…

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…

带格式 pdf 翻译

支持 openAI 接口,国内 deepseek 接口兼容 openAI 接口, deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate

ubuntu22.04降级安装CUDA11.3

环境:主机x64的ubuntu22.04,原有CUDA12.1,但是现在需要CUDA11.3,本篇文章介绍步骤。 一、下载CUDA11.3的run文件 下载网址:https://developer.nvidia.com/cuda-11-3-1-download-archive?target_osLinux&target_…

9 异常

如果你希望在软件调试上有所突破,或者想了解如何通过异常进行反调试,或者想自己写一个调试器,那么就必须要深入了解异常,异常与调试是紧密相连的,异常是调试的基础。 异常产生后,首先是要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,我们…

springBoot整合ELK Windowsb版本 (elasticsearch+logstash+kibana)

springBoot整合ELK Windowsb版本 【elasticsearchlogstashkibana】 下载软件启动服务1、elasticsearch2、kibana3、logstash 集成springboot1、添加依赖2、在logback.xml添加相关配置3、修改logstash 配置4、重启logstash 最后测试 下载软件 elasticsearch 官网 https://www.…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

鸿蒙面试 2025-01-10

写了鉴权工具,你在项目中申请了那些权限?(常用权限) 位置权限 : ohos.permission.LOCATION_IN_BACKGROUND:允许应用在后台访问位置信息。 ohos.permission.LOCATION:允许应用访问精确的位置信息…

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…