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;}@Overridepublic 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.hqwc.cn/news/681096.html

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

相关文章

提升工作效率,用ONLYOFFICE打造高效团队协作环境

作为一名深耕技术领域已有六七年的开发者&#xff0c;同时又是断断续续进行技术创作将近六年的一个小小作者&#xff0c;我在工作和日常生活中&#xff0c;使用过各色各样的软件。 而在最近几年&#xff0c;一款名为ONLYOFFICE的开源办公套件逐渐走进并融入我的工作与生活&…

CPU基本知识点

目录 1.概念 2.分类 3.运作原理 4.指令系统 1.概念 CPU&#xff1a;英文Central Processing Unit&#xff0c;即中央处理器。 解释和执行指令的功能单元&#xff0c;它是计算机的中枢神经系统&#xff08;即核心&#xff09;。 是计算机最核心的部件&#xff0c;主要是运算…

Springboot+vue项目影城管理系统

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

Tower for Mac:Git管理的新境界

Tower for Mac&#xff0c;让您的Git管理进入新境界&#xff01;这款专为Mac用户打造的Git客户端&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;成为众多开发者的首选工具。 Tower不仅支持常规的Git操作&#xff0c;如提交、推送和拉取&#xff0c;还提供了许多高级功能…

使用CNN或resnet,分别在flower5,flower17,flower102数据集上实现花朵识别分类-附源码-免费

前言 使用cnn和resnet实现了对flower5&#xff0c;flower17&#xff0c;flower102数据集上实现花朵识别分类。也就是6份代码&#xff0c;全部在Gitee仓库里&#xff0c;记得点个start支持谢谢。 本文给出flower17在cnn网络实现&#xff0c;flower102在resnet网络实现的代码。…

effective python学习笔记_推导与生成

用推导取代map和filter 序列推导可取代map和filter&#xff0c;优越性有&#xff1a;1可读性强2不需要map的函数 控制推导逻辑的子表达式不要超过2个 即推导的for层数最多建议两层&#xff0c;多了可读性会下降&#xff0c;反而用for循环会清晰 一层for内可连接多个if&…

Segmentation fault (core dumped)排查

先泼盆冷水&#xff0c;这个问题比较棘手&#xff0c;有的能通过重装opencv相关包修复&#xff0c;有的可能还是直接换一个没问题的环境比较快…… 我最后是没有解决的&#xff0c;折腾了几个小时后&#xff0c;还是听同事的话&#xff0c;把docker镜像重启了&#xff0c;幸好…

数据存储-SQLite

一般使用到数据库存储&#xff0c;涉及到的数据量都较大&#xff0c;采用文件存储也能完成&#xff0c;但是文件操作复杂&#xff0c;效率低&#xff0c;大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite&#xff0c;直接按照数…

PY计算生态是什么?

Python 的计算生态指的是与 Python 相关的广泛的软件、库、框架和工具集合. 它们为各种计算任务提供了丰富的解决方案和支持。Python 作为一种简洁、易学、功能强大的编程语言&#xff0c;在科学计算、数据分析、人工智能、机器学习等领域都有着强大的影响力。以下是 Python 计…

利用组合数进行幂集索引

在计算机科学中&#xff0c;通常使用二进制表示来表示子集的包含情况。如果集合中有n个元素&#xff0c;那么幂集的大小为2^n。考虑一个集合{a, b, c}&#xff0c;其幂集为{{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}}。每个子集都可以用二进制数来表示&#xff0c…

每日两题 / 104. 二叉树的最大深度 102. 二叉树的层序遍历(LeetCode热题100)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 递归判断&#xff0c;当前节点的最大深度为1 max(左节点的最大深度&#xff0c;右节点的最大深度) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

回答篇:测试开发高频面试题目

引用之前文章&#xff1a;《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…