HTTP拾技杂谈

HTTP拾技杂谈

简单聊聊HTTP中的那些东西


文章目录

  • HTTP拾技杂谈
  • 前言
  • HTTP协议
    • 1.请求从客户端到服务器端的4个步骤
      • 一般客户端请求如下:
      • 服务端响应如下
    • 2.Keep-Alive
    • HTTP方法
    • Cookie
  • 总结


前言

超文本传输协议(Hypertext Transfer Protocol ,HTTP)是一个标准,定义了Web客户端如何与服务器对话,以及数据如何从服务器传回客户端。尽管通常任务HTTP是一种传输HTML文件以及文件中内嵌图片的方法,但实际上HTTP是一个数据格式。——《java网络编程》


HTTP协议

HTTP连接使用TCP/IP来传输数据。

1.请求从客户端到服务器端的4个步骤

  1. 默认情况下,客户端在80端口与服务器打开一个TCP连接,URL可以指定其他端口
  2. 客户端向服务器发送消息,请求指定路径上的资源。请求分为首部、可选地址、请求数据。
  3. 服务器向客户端回复响应。以响应码开头,后面是包含元数据的首部、一个空行、所请求的文档(数据)或错误消息。
  4. 服务器关闭连接。
    以上就是基本HTTP1.0过程,在HTTP1.1及以后版本中,可以复用TCP连接实现发送多个请求。在1.1中请求和响应可以分为多个块发送。

一般客户端请求如下:

POST /api/data HTTP/1.1          # 请求行(方法 + URI + HTTP版本)
Host: www.example.com            # 目标主机(必需首部)
User-Agent: Mozilla/5.0          # 客户端标识
Content-Type: application/json   # 消息体格式说明
Content-Length: 27               # 消息体字节长度(必需首部)
Accept: application/json         # 期望的响应格式
Authorization: Bearer abc123     # 认证令牌
Connection: keep-alive           # 连接控制#注意这里的空一行是标准
{"key": "value", "num": 42}      # 消息体(实际传输的数据)

第一行为请求行,包括方法、从服务器获取资源路径以及HTTP版本。
其他则是以 Key:Value组成的信息。
像User-Agent代表浏览器版本,host服务器名,Accept,告诉服务器,客户端可以处理什么样的数据(定义服务器返回格式)。
这些类型统称为MIME类型,分为两级:类型和子类型。例如:application/json

text/*
image/*
application/*
...等

当然也可以自定义非标准的定制类型和子类型,只要以x-开头。例如flash文件,使用application/x-shockwave-flash类型。
最后以空行,或者空行+数据体

服务端响应如下

HTTP/1.1 200 OK                          # 状态行(协议版本 + 状态码 + 原因短语)
Server: nginx/1.18.0                     # 服务器软件及版本
Date: Fri, 13 Oct 2023 05:30:15 GMT      # 响应生成时间
Content-Type: text/html; charset=UTF-8   # 消息体的格式和编码
Content-Length: 1234                     # 消息体的字节长度
Connection: keep-alive                   # 连接控制(保持活跃)
Cache-Control: max-age=3600              # 缓存策略(有效期1小时)
ETag: "abc123xyz"                        # 资源版本标识符
Last-Modified: Mon, 09 Oct 2023 12:00:00 GMT  # 资源最后修改时间<!DOCTYPE html>                          # 空行(分隔首部和消息体)
<html>                                   # 消息体(实际返回的内容)<head><title>Example Page</title></head><body><h1>Hello World</h1></body>
</html>

第一行表示服务器使用的协议HTTP1.1,紧跟一个响应码。其他首部行则指出请求的日期、消息体字节长度等

2.Keep-Alive

在HTTP请求的首部中大家是否注意到Keep-Alive,他表示可以重用一个socket:
Connection:Keep-Alice。
在HTTP1.0会为每个请求打开一个新的连接,而这样打开和关闭消耗的资源远远大于实际传输数据的开销。所以在HTTP1.1以后就默认支持,复用socket连接,如果需要关闭则使用上述key-value显示控制。

  • 在java中可以通过http.keepAlive控制true/false,来控制socket复用
  • http.maxConnections可以表示希望同时打开的socket的数量,来保证服务器不会被大量连接冲崩溃。

HTTP方法

HTTP服务器的遵循请求-响应模式:无状态请求+无状态响应。
HTTP的方法主要有4个:
POST、GET、PUT、DELETE
对于这些方法的使用,再谈谈几点容易被忽略的细节:

  • GET方法获取一个资源,它没有副作用,如果失败可以反复执行,而不用担心有什么问题
  • GET输出可能会被缓存,可以通过首部取消缓存进行禁用
  • PUT方法表示将资源上传到服务器,但它具有幂等性。重复该方法也不用担心是否失败,两次将同一个文档放在同一个位置并不影响。
  • DELETE与PUT一样具有幂等性,重复执行,也只会将资源删除一次。
  • POST是最常用的方法,POST要用于不能重复的不安全的操作,如完成一个交易。

Cookie

很多网站使用一些小文本串在连接之间存储持久的客户端状态,这些称为cookie。
cookie在请求和响应的HTTP首部中,由服务器传递到客户端,再从客户端传回服务器。
cookie可以是标识会话ID、购物车、登录凭据等信息,也可以存无意义的值。
要在浏览器设置一个cookie,则需要服务器端在响应中使用Set-Cookie首部行:

HTTP/1.1 200 OK                          # 状态行(协议版本 + 状态码 + 原因短语)
Content-Type: text/html; charset=UTF-8   # 消息体的格式和编码
Set-Cookie: xxx=dsahjfkeqyowqlf   # 设置cookie

而后,客户端再向同一个服务发送请求:

GET /index.html HTTP/1.1          # 请求行(方法 + URI + HTTP版本)
Host: www.example.com            # 目标主机(必需首部)
Cookie:cart = dsahjfkeqyowqlf   #cookie要与服务器给的一致

当然服务器可以设置不止一个cookie,可以有多个Set-Cookie,用于控制过期时间、路径、端口、值等信息。

默认情况下,cookie来自哪个服务器则应用于哪个服务器。网站也可以指示一个cookie用于整个子域,例如从www.foo.example.com响应的:
Set-Cookie:user = elharo;Domain=.foo.example.com
表示浏览器除了可以用cookie返回最初的www.foo.example.com,还可发送给*.foo.example.com
当然还可以缩小它的使用域
例如:Set-Cookie: user=elharo; Path=/restricted,表示请求服务器上子树/restricted,可以。而相同网站的其他目录中就不能使用这个cookie。
在Set-Cookie中使用expires = Wdy, DD-Mon-YYYY HH:MM:SS GMT 可以设置cookie的过期时间。
设置Max-Age = 3600 ,则表示3600秒后过期,此时浏览器会从缓存中删除这些cookie。


总结

本章节介绍了HTTP协议是现代Web通信的核心,其设计简洁高效,支持多种请求方法和数据格式,并通过Cookie机制实现了客户端状态的持久化。随着HTTP版本的演进,连接复用等优化机制进一步提升了通信性能。本文详细介绍了HTTP协议的基本原理、请求响应格式、方法特性以及Cookie机制。

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

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

相关文章

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…

自然语言处理:最大期望值算法

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文简称为EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型参数的过程分成…

【从零开始学习计算机科学】计算机体系结构(一)计算机体系结构、指令、指令集(ISA)与量化评估

【从零开始学习计算机科学】计算机体系结构(一)计算机体系结构、指令、指令集(ISA)与量化评估 概论计算机体系结构简介计算机的分类并行体系结构指令集体系结构(ISA)分类存储器寻址寻址模式操作数大小指令ISA的编码程序的优化计算机体系结构量化评估存储器体系结构概论 …

Electron使用WebAssembly实现CRC-32 常用标准校验

Electron使用WebAssembly实现CRC-32 常用标准校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 常用标准格式校验的方式。 CRC-32 常用标准校验函数WebAssembly源文件…

Docker基础篇——Ubuntu下Docker安装

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起进行Docker安装。 Docker的官方Ubuntu安装文档&#xff0c;如…

第五课:Express框架与RESTful API设计:技术实践与探索

在使用Node.js进行企业应用开发&#xff0c;常用的开发框架Express&#xff0c;其中的中间件、路由配置与参数解析、RESTful API核心技术尤为重要&#xff0c;本文将深入探讨它们在应用开发中的具体使用方法&#xff0c;最后通过Postman来对开发的接口进行测试。 一、Express中…

mitmproxy配合Wireshark 抓包分析

Mitmproxy 是一款非常强大的 交互式 HTTP 代理 工具&#xff0c;它被广泛应用于 Web 开发、API 调试、安全测试 等领域。与 Wireshark 侧重于被动监听网络流量不同&#xff0c;Mitmproxy 更像一个 主动的中间人&#xff0c;可以拦截、检查、修改和重放 HTTP/HTTPS 流量&#xf…

Varlens(手机上的单反)Ver.1.9.3 高级版.apk

Varlens 是一款专业级手机摄影软件&#xff0c;旨在通过丰富的功能和高自由度参数调节&#xff0c;让手机拍摄效果媲美微单相机。以下是核心功能总结&#xff1a; 一、核心功能 专业拍摄模式 支持手动/自动/程序模式&#xff0c;可调节ISO、快门速度、EV、白平衡等参数27 提供…

Scala 中的访问修饰符

在Scala中&#xff0c;面向对象的权限控制主要通过访问修饰符来实现。Scala提供了以下几种访问修饰符来控制类、对象、成员变量和方法的访问权限&#xff1a; 1. 默认访问权限&#xff08;无修饰符&#xff09; 如果没有指定任何访问修饰符&#xff0c;成员默认是public的&…

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…

Dify使用日常:我是如何按标题级别将word中的内容转存到excel中的

先上效果图 word中的内容 转存到excel之后 实现步骤&#xff1a; 1、在dify中创建一个工作流&#xff0c;如上图 2、在开始节点增加一个支持文件上传的变量 3、添加文档提取器&#xff0c;提取上传的文件中的内容 4、添加大模型节点&#xff0c;将文档提取器提取出来的内容&…

Vue 框架深度解析:源码分析与实现原理详解

文章目录 一、Vue 核心架构设计1.1 整体架构流程图1.2 模块职责划分 二、响应式系统源码解析2.1 核心类关系图2.2 核心源码分析2.2.1 数据劫持实现2.2.2 依赖收集过程 三、虚拟DOM与Diff算法实现3.1 Diff算法流程图3.2 核心Diff源码 四、模板编译全流程剖析4.1 编译流程图4.2 编…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

认识vue2脚手架

1.认识脚手架结构 使用VSCode将vue项目打开&#xff1a; package.json&#xff1a;包的说明书&#xff08;包的名字&#xff0c;包的版本&#xff0c;依赖哪些库&#xff09;。该文件里有webpack的短命令&#xff1a; serve&#xff08;启动内置服务器&#xff09; build命令…

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导

尽管《机器学习数学基础》这本书&#xff0c;耗费了比较长的时间和精力&#xff0c;怎奈学识有限&#xff0c;错误难免。因此&#xff0c;除了在专门的网页&#xff08; 勘误和修订 &#xff09;中发布勘误和修订内容之外&#xff0c;对于重大错误&#xff0c;我还会以专题的形…

解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统

目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…

第七课:Python反爬攻防战:Headers/IP代理与验证码

在爬虫开发过程中&#xff0c;反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制&#xff0c;并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码&#xff0c;帮助读者更好地理解和…

Vue3——Fragment

文章目录 一、Fragment的核心意义1. 解决Vue2的单根限制问题2. 减少不必要的 DOM 嵌套3. 语义化和结构化 二、Fragment 的实现原理三、Fragment 使用方式1. 基本用法2. 结合条件渲染3. 动态组件 四、实际应用场景1. 列表/表格组件2. 布局组件3. 语义化标签 五、注意事项1. 属性…

字节跳动C++客户端开发实习生内推-抖音基础技术

智能手机爱好者和使用者&#xff0c;追求良好的用户体验&#xff1b; 具有良好的编程习惯&#xff0c;代码结构清晰&#xff0c;命名规范&#xff1b; 熟练掌握数据结构与算法、计算机网络、操作系统、编译原理等课程&#xff1b; 熟练掌握C/C/OC/Swift一种或多种语言&#xff…