JavaEE 初阶篇-深入了解 HTTP 协议

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 HTTP 协议概述

        2.0 HTTP 请求协议

        2.1 请求方式的具体体现

        3.0 HTTP 响应协议

        3.1 常见的状态码及描述

        3.2 常见的响应头

        4.0 HTTP 协议解析

        4.1 简单实现服务器响应客户端请求


        1.0 HTTP 协议概述

        HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议。它是 Web 上数据传输的基础,用于在客户端和服务器之间传输数据。HTTP 是一个无状态的协议,即每个请求都是独立的,服务器不会保存任何关于客户端的状态信息。

        HTTP 协议基于请求-响应模型,客户端发送请求给服务器,服务器处理请求并返回响应。请求由请求行、请求头和请求体组成,响应由状态行、响应头和响应体组成。

        HTTP 协议使用 TCP 作为传输层协议,通常在 80 端口上进行通信。它支持多种请求方法,如 GET、POST、PUT、DELETE 等,用于不同的操作。HTTP 还支持状态码来表示请求的处理结果,如 200 表示成功,404 表示未找到等。

特点:

        1)基于 TCP 协议:面向连接,安全。

        2)基于请求-响应模型的:一次请求对应一次响应。

        3)HTTP 协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。缺点:多次请求间不能共享数据。优点:速度快。

        2.0 HTTP 请求协议

        HTTP 请求协议是客户端向服务器发送请求的格式和规范。一个标准的 HTTP 请求由以下几部分组成:

        1)请求行:包含请求方法、请求的 URL 和协议版本。常见的请求方法有 GET、POST、PUT、DELETE 等。

        在请求格式中的第一行中包含:

                1.1)有发送的请求方法,常见的请求方法有 GET、POST 方法。

                1.2)资源路径,访问的资源路径。

                1.3)协议版本,比如 HTTP/1.1

举个例子:

        这个 HTTP 协议中用到了 GET 请求的方法,还有资源路劲、版本为 HTTP/1.1。 

        2)请求头:包含一系列的键值对,用于传递请求的元数据信息,如 User-Agent(用户代理)、Host(主机名)、Content-Type(内容类型)等。

常见的数据信息:

        2.1)Host:请求的主机名。

        2.2)User-Agent:浏览器版本。

        2.3)Accept:表示浏览器能接受的资源类型,如 text/*,image/* 或者 */* 表示所有;

        2.4)Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页。

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

        2.6)Content-Type:请求主题的数据类型。

        2.7)Content-Length:请求主体的大小(单位:字节)。

举个例子:

        3)空行:请求头和请求体之间需要有一个空行来分隔。

        4)请求体:可选的,通常用于传输请求的数据,如POST请求中的表单数据、上传文件等。

        4.1)请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=OPPO&status=1。请求参数而是在请求行中的资源路径后加上 ? 和 请求参数。GET 请求大小是有限制的。

        4.2)请求方法-POST:请求参数在请求体中,POST 请求大小是没有限制的。

举个例子:

POST /api/users HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Authorization: Bearer abcdef1234567890

{
  "name": "John Doe",
  "email": "johndoe@example.com",
  "age": 30
}

        在这个示例中,请求方法是 POST,请求的 URL 是 /api/users ,协议版本是 HTTP/1.1。请求头包含 Host、User-Agent、Content-Type 和 Authorization 等信息。请求体是一个 JSON 格式的数据,包含了用户的姓名、邮箱和年龄信息。

        2.1 请求方式的具体体现

HTML 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    <form action="" method="get">
        名字:<input type="text" name="name"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit" value="利用GET方法提交">
    </form>
    <br><br>
    <form action="" method="post">
        名字:<input type="text" name="name"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit" value="利用POST方法提交">
    </form>


</body>
</html>

运行页面:

1)利用 DET 方法提交结果:

提交后,请求参数就会在资源路径中出现:

2)利用 POST 方法提交结果:

提交后,请求参数会在请求体中出现:

分析视图:

        3.0 HTTP 响应协议

        HTTP 响应协议是一种用于在客户端和服务器之间传输数据的协议。它定义了服务器对客户端请求的响应格式和规范。

        HTTP 响应协议由状态行、响应头、空行和响应体组成

        状态行包含了响应的状态码和描述,响应头包含了响应的元数据信息,空行用于分隔响应头和响应体,响应体包含了实际的响应数据。

举个例子:

        3.1 常见的状态码及描述

        1)以 “1xx” 开头的状态码:响应中-临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它。

        2)以 “2xx” 开头的状态码:成功-表示请求已经被成功接收,处理已完成。

        3)以 “3xx” 开头的状态码:重定向-重定向到其他地方;让客户端再发起一次请求以完成整个处理。

        4)以 “4xx” 开头的状态码:客户端错误-处理发生错误,责任在客户端。如:请求了不存在的资源,客户端未被授权、禁止访问等。

        5)以 “5xx” 开头的状态码:服务器错误-处理发生错误,责任在服务端。如:程序抛异常等。

具体的状态码:

        3.2 常见的响应头

        1)Content-Type:表示该响应内容的类型,例如 text/html,application/json 。

        2)Content-Length:表示该响应内容的长度(字节数)。

        3)Content-Encoding:表示该响应压缩算法,例如 gzip 。

        4)Cache-Control:指示客户端如何缓存,例如 max-age=300 表示可以最多缓存 300 秒。

        5)set-Cookie:告诉浏览器为当前页面所在的域设置 cookie 。

        4.0 HTTP 协议解析

        由于浏览器已经自带了 HTTP 协议解析,所以,主要是对服务器端开发 HTTP 协议解析。

        4.1 简单实现服务器响应客户端请求

        客户端发起一次请求,服务器就会响应一次,大致的解析过程:

        先客户端与服务器建立连接,客户端发送一次请求。接着,服务端接收到来自客户端发送的请求,先验证发送的请求行是否正确,接着响应客户端请求的数据。

代码如下:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Hello {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true){
            //管道接通
            Socket socket = serverSocket.accept();
            Thread thread = new MyThread(socket);
            thread.start();
            System.out.println(thread.getName() + " 正在执行!!!");
        }

    }
}
import java.io.*;
import java.net.Socket;

public class MyThread extends Thread{

    Socket socket;
    public MyThread (Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try(
                OutputStream os = socket.getOutputStream();
                InputStream is = socket.getInputStream();

                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
        ){

            //先接受客户端请求过来的数据
            String s;
            while (!(s = reader.readLine()).isEmpty()){
                System.out.println(s);
            }

            StringBuilder stringBuilder = new StringBuilder();
            //读取数据
            readData(stringBuilder);

            //接着再返回数据
            writer.write("HTTP/1.1 200 OK\r\n");
            writer.write("Content-Type:text/html;charset=UTF-8\r\n");
            writer.write("\r\n");
            writer.write(stringBuilder.toString());


        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public void readData(StringBuilder stringBuilder){

        try(
                InputStream inputStream = new FileInputStream("D:\\software\\code\\2023_java\\2023_java_code\\code_24_5_8\\src\\main\\java\\org\\example\\Demo\\response.html");
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        ){
            while (true){
                String s = reader.readLine();
                if ( s == null || s.isEmpty()){
                    break;
                }
                stringBuilder.append(s);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
<table border="1px" cellspacing="0px" align="center">
    <tr>
        <th>姓名</th>
        <th>性别</th>
        <th>ID</th>
    </tr>
    <tr>
        <td>小扳手</td>
        <td>男</td>
        <td>01</td>
    </tr>
    <tr>
        <td>小童</td>
        <td>女</td>
        <td>02</td>
    </tr>
    <tr>
        <td>小落</td>
        <td>男</td>
        <td>03</td>
    </tr>
    <tr>
        <td>小益</td>
        <td>女</td>
        <td>04</td>
    </tr>
</table>
</body>
</html>

运行结果:

访问当前服务器端口号 8888 :

        需要注意的是:解析 HTTP 协议代码可远远不止以上这些,以上这些代码只是了解服务端大致解析 HTTP 协议的简单流程仅此而已,还有很多很多复杂的过程以上代码都没有涉及到。

        因此得知,程序员手动实现解析 HTTP 协议代码是不现实的。

        为了更高效地处理 HTTP 请求,程序员通常会使用现成的 HTTP 服务器框架或库,例如 Node.js 中的 Express 框架、Python 中的 Django 框架等。这些框架和库已经实现了完整的 HTTP 协议解析和处理功能,开发者只需要调用相应的接口来处理请求和响应即可,大大简化了开发过程。

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

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

相关文章

Linux/Intuition

Intuition Enumeration nmap 使用 nmap 扫描系统常见端口&#xff0c;发现对外开放了 22 和 80&#xff0c;然后扫描这两个端口的详细信息 ┌──(kali㉿kali)-[~/vegetable/HTB/Intuition] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.11.15 Starting Nmap 7.93 ( https:…

Springboot+vue项目影城管理系统

摘 要 本论文主要论述了如何使用JAVA语言开发一个影城管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述影城管理系统的当前背景以及系统开发的目的&…

计算机SCI期刊,IF=9.657,1区TOP,2周内出版!

一、期刊名称 Neural Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;7.8 中科院分区&#xff1a;1区TOP 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需支付$3350 三、期刊简介 神…

Shell生成支持x264的ffmpeg安卓全平台so

安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so&#xff08;本章&#xff09; 文章目录 安卓 FFmpeg系列前言一、实现步骤1、下载x264源码2、交叉编译生成.a3、加入x264配置4、编译ffmp…

【ZIP技巧】ZIP分卷压缩包如何解压?

经过压缩的文件仍然过大&#xff0c;大家可能都会选择“分卷压缩”来压缩ZIP文件&#xff0c;但是当我们将压缩包分卷之后&#xff0c;解压的时候该如何解压&#xff1f;今天我们分享两个ZIP分卷压缩包如何解压的方法给大家。 一、 我们可以直接点击第一个分卷压缩包&#xf…

DHC:用于类别不平衡的半监督医学图像分割的双重去偏异构协同框架

文章目录 DHC: Dual-Debiased Heterogeneous Co-training Framework for Class-Imbalanced Semi-supervised Medical Image Segmentation摘要方法Distribution-aware Debiased Weighting (DistDW)Difficulty-aware Debiased Weighting (DiffDW) 实验结果 DHC: Dual-Debiased He…

Context capture/Pix4Dmapper/AutoCAD/CASS/EPS软件的安装流程与使用方法;土方量计算;无人机摄影测量数据处理

目录 专题一 无人机摄影测量技术应用现状及其发展 专题二 基本原理和关键技术讲解 专题三 无人机影像外业数据获取 专题四 数据处理环境建立与软件熟悉 专题五 GNSS数据土方量计算 专题六 基于无人机影像数据的正射影像制作 专题七 基于无人机影像数据的三维模型制作 专…

TS流加扰的判断

一般情况下&#xff0c;1套节目是否加扰 在SDT表中或者包头的加扰位2处判断。 1.SDT表的free_CA_mode0是未加密&#xff0c;1是加密&#xff1b;在SDT表中&#xff0c;只是一个规范&#xff08;如果节目加密了&#xff0c;应该让free_CA_mode1&#xff09;。实际上&#xff0c…

燃气电力瓶装气行业入户安检小程序开发

我们开发的小区业主入户安检小程序&#xff0c;旨在满足燃气、电力以及其他需要入户安检的行业需求。该程序支持自定义安检项目&#xff0c;实现线下实地安检与线上数据保存的完美结合。在安检过程中&#xff0c;我们可以拍照或录像&#xff0c;以确保安检的透明性和可追溯性&a…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…

应聘项目经理,软考证书会是一个加分项吗?

加分项是必需的&#xff0c;特别是IT行业的项目经理职位。您可以在各大招聘网站上搜索项目经理职位&#xff0c;前景好、薪资高、待遇好的项目经理岗位&#xff0c;基本上都有证书的要求。非IT行业项目经理&#xff0c;可以考虑PMP证书或者其他与专业相关的证书&#xff0c;比如…

Android 高版本实现沉浸式状态栏

目前实现的android高版本沉浸式状态栏分为两类&#xff1a; 1、是纯透明状态栏&#xff1b; 2、是纯透明状态栏&#xff0c;但是状态栏字体是黑色&#xff1b; 将状态栏的代码封装到BaseActivity中更方便使用&#xff1a; BaseActivity: public abstract class BaseActivit…

大模型微调实战之强化学习 贝尔曼方程及价值函数(一)

大模型微调实战之强化学习 贝尔曼方程及价值函数 强化学习&#xff08;RL&#xff09;是机器学习中一个话题&#xff0c;不仅在人工智能方面。它解决问题的方式与人类类似&#xff0c;我们每天都在学习并在生活中变得更好。 作为一名大模型学习者&#xff0c;当开始深入研究强…

校验--ECC详细分析

ECC介绍 ECC 以下是针对瑞萨MCU的应用的ECC检测的详细分析。 当前公认安全有效的三大类公钥密钥体制分别为基于大数因子分解难题(RSA)、离散对数难题(DSA)和椭圆曲线离散对数&#xff08;ECC&#xff09;难题的密码体制。 保证RSA的安全性&#xff0c;则必须要增加密钥长度…

【最优传输二十九】Wasserstein Barycenterand Its Application to Texture Mixing

motivation 本文提出了离散概率分布的平均作为Monge-Kantorovich最优传输空间重心的新定义。为了克服数值求解这类问题所涉及的时间复杂性&#xff0c;原始的Wasserstein度量被一维分布上的切片近似所取代。这使我们能够引入一种新的快速梯度下降算法来计算点云的Wasserstein质…

Cesium 问题:billboard 加载未出来

文章目录 问题分析问题 接上篇 Cesium 展示——图标的依比例和不依比例缩放,使用加载 billboard 时,怀疑是路径的原因导致未加载成功 分析 原先

初步了解Kubernetes

目录 1. K8S概述 1.1 K8S是什么 1.2 作用 1.3 由来 1.4 含义 1.5 相关网站 2. 为什么要用K8S 3. K8S解决的问题 4. K8S的特性 5. Kubernetes集群架构与组件 6. 核心组件 6.1 Master组件 6.1.1 Kube-apiserver 6.1.2 Kube-controller-manager 6.1.3 kube-schedul…

算法学习008-登山爬石梯 c++动态规划/递归算法实现 中小学算法思维学习 信奥算法解析

目录 C登山爬石梯 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C登山爬石梯 一、题目要求 1、编程实现 小明周末和朋友约好了一起去爬山&#xff0c;来到山下&#xff0c;发现登山道是…

【问题实操】银河高级服务器操作系统实例分享,开机之后反复重启

1.服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器&#xff1a; PHYTIUM FT2000PLUS 2200 MHz 内存&#xff1a; 128 GiB 整机类型/架构&#xff1a; HIKVISION DS-V BIOS版本&#xff1a; HK 601FBE02HK 网卡&#xff1…

VTK数据的读写--Vtk学习记录1--《VTK图形图像开发进阶》

读和写操作是VTK可视化管线两端相关的类--Reader和Writer类 Reader:将外部数据读入可视化管线&#xff0c;主要步骤如下 s1:实例化Reader对象 s2:指定所要读取的文件名 s3:调用Update()促使管线执行 对应的Writer: s1:实例化Writer对象 s2输入要写的数据以及指定写入的文…
最新文章