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

news2024/11/16 12:00:36

🔥博客主页: 【小扳_-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.coloradmin.cn/o/1656440.html

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

相关文章

win11环境下,Idea 快捷键shift+f6重命名无法使用

微软自带输入法导致 单击win弹出搜索框

Java数据结构---栈和队列

目录 栈&#xff08;Stack&#xff09; 队列&#xff08;Queue&#xff09; 循环队列 栈&#xff08;Stack&#xff09; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除操作元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一…

【启明智显分享】7寸HMI智能屏应用方案:Model4芯片实现展会多媒体互动展示

所谓&#xff1a;“技术是底层逻辑&#xff0c;用户是中心动力”。技术水平不断提升&#xff0c;人们对展会展览的形式和体验不断提出更多的要求&#xff0c;展会展现形式也正在不断地寻求突破。 传统的展示形式往往只能提供静态显示和有限的互动体验&#xff0c;在这个公众注意…

因表别名引用错误导致查询SQL执行时间长未出结果

问题描述&#xff1a; 项目组人员反馈在执行一条提取数据SQL时执行很慢&#xff0c;每次执行一段时间就报超时&#xff0c;要求帮忙提取下。 解决过程&#xff1a; 项目组人员发来SQL后&#xff0c;看了下SQL&#xff0c;没什么问题&#xff0c;就在客户端上执行了下&#xff0…

Antd Table组件,state改变,但是render并不会重新渲染

背景 在table上面&#xff0c;当鼠标放在cell上面的时候&#xff0c;需要去请求接口拉取数据&#xff0c;然后setList(res.result)后&#xff0c;希望render中的traceIds也能够实时更新渲染。 const [traceIds, setTraceIds] useState() // 需要展示在popover上面的数据&…

社媒营销中的截流获客是怎么一回事?

如果你要问&#xff0c;现在做社媒营销是通过哪些方式进行引流的&#xff0c;那么必然有一种是截流&#xff0c;顾名思义也就是分取别人的流量&#xff0c;方法其实很简单&#xff0c;主要分为两种&#xff1a;&#xff08;1&#xff09;抓取别人的粉丝出来进行群发私信&#x…

2024上海国际地下空间工程与技术展览会

2024上海国际地下空间工程与技术展览会 2024 Underground Space Project and Technology Expo 时间&#xff1a;2024年10月30日-11月1日 地点&#xff1a;上海世博展览馆 主办单位&#xff1a;联合国人居署 上海市住房与城乡建设管理委员会 城博会背景 上海国际城市与建筑…

mysql数据库---操作数据库跟表的命令总结

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文着重整理mysql管理库跟表的指令。 不涉及增删查改等指令 其实本篇主要是我做好笔记格式 用的时候直接复制粘贴的 所以排版大多是为了快速找功能来排的 方便大家快速找目标语法 数据库的简介 一个数据库系…

(代码以上传,超级详细)面试必备算法题----Leeecode290单词规律

文章目录 概要题目要求测试and提交结果技术细节 概要 来自Leecode ​ 代码已上传&#xff09;仓库&#xff0c;需要测试实例和其他题型解决&#xff0c;可以去自行浏览 点击这里进入仓库领取代码喔&#xff01;顺便点个star给原子加油吧&#xff01; ​ 题目要求 使用哈希表 …

国内外主流大模型都具备有哪些特点?

文章目录 ⭐ 火爆全网的大模型起点⭐ 国外主流LLM及其特点⭐ 国内主流LLM及其特点⭐ 全球大模型生态的发展 该章节呢&#xff0c;我们主要是看一下关于国内外主流的大语言模型&#xff0c;通过它们都具备哪些特点&#xff0c;来达成对多模型有一个清晰的认知。对于 “多模型” …

tensorflow报错

参考 TensorFlow binary is optimized to use available CPU instructions in performance-critical operations._this tensorflow binary is optimized to use availab-CSDN博客 解决Python中cuBLAS插件无法注册问题_unable to register cudnn factory: attempting to re-CS…

获取两个时间之间的月份

工具类 public static List<String> getMonthBetweenDate(Date startDate, Date endDate) {ArrayList<String> result new ArrayList<String>();SimpleDateFormat sdf new SimpleDateFormat("yyyy.MM");//格式化&#xff0c;调整为自己需要的格…

LED显示屏控制器5个问题和解答

在LED电子显示屏的使用和维护过程中&#xff0c;用户经常会遇到各种技术问题。以下是五个关于LED电子显示屏控制器的常见问题及其解答&#xff0c;由专业LED显示屏生产厂家提供&#xff0c;旨在帮助用户更好地理解和使用LED显示屏。 1. 嵌入式实时脱机二合一控制器的工作原理 嵌…

cmake工程导入新电脑环境报错

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在一台电脑上运行得很好的cmake工程&#xff0c;导入新电脑环境报错 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如&#xff1a;数据传输过程中数据不时出现丢失的情况&…

从零开始!学习绘制3D表情的详细指南

在2020 年的苹果全球开发者大会(WWDC)&#xff0c;苹果发布了新的 macOS 11(又名 Big Sur)。其中在UI视觉方面macOS Big Sur 系统最大的变化就是图标上&#xff0c; Big Sur更新了很多新设计风格的 3D应用图标&#xff0c;3D设计的确可以提升UI整体的视觉氛围&#xff0c;并且现…

Python Flask框架(二)Flask与HTTP

HTTP&#xff0c;即超文本传输协议&#xff0c;定义了服务器与客户端之间信息交流的格式和传递方式。 当用户访问一个URL&#xff0c;浏览器便生成对应的HTTP请求&#xff0c;经由互联网发送到对应的Web服务器。Web服务器接收请求&#xff0c;通过WSGI将HTTP格式的请求数据转换…

AI日报:干翻AI PC!苹果M4芯片首发;GoEnhance可生成粘土风格视频;DeepSeek-V2模型已在魔搭社区开源

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 1、干翻AI …

【Unity】如何获得TMP Button下的text内容

【背景】 unity项目中使用了TMP命名空间的Button UI组件。脚本中需要获得Button下Text的内容,但是发现用TextMeshPro仍然无法获得button下的text对象。 【分析】 Hierarchy结构上看明确Button下是有Text组件的: 括号里是TMP,所以理论上用TextMeshPro类型去FindComponent…

【neteq】tgcall的调用、neteq的创建及接收侧ReceiveStatisticsImpl统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

linux 使用intel oneapi报错报错

使用intel oneapi 2024.1.0 时经常报这个错误 因为当前 intel2024.1.0没有在使用 需要改回2024.0.0并安装适配的torch的包来运行