Linux网络编程——HTTP协议的理解与运用
目录
前言
一、认识URL
二、认识HTTP样例
三、HTTP的报头内容
1.url
2. Content-Type
3.Method 方法
1.GET方法
2.POST方法
4、状态码
前言
我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们也进行了自定义协议的序列化与反序列化,了解到了协议是如何进行约定的。今天我们来学习一下被广泛运用的应用层协议——HTTP(超文本传输协议)。
一、认识URL
在我们访问别人的网站时,通常会输入网址或者点击别人的链接(跳转到该网址)进行访问,我们平时说的网址也就是url。

比如说百度的链接如下,https为他的协议方案名,比http多了加密,www.baidu.com为他的服务器地址(也是域名),会通过DNS域名解析将该域名转化为一个IP地址,"/"为访问他的web根目录。
https://www.baidu.com/
再比如说我们百度搜索caixukun,就会访问到"/s目录","?"后面就可以带参数了,"wd=caixunkun"为我们的搜索内容,"&"后面又跟着很多参数
https://www.baidu.com/s?wd=caixukun&rsv_spt=1&rsv_iqid=0xa125eeac0124f4d8&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&oq=%25E8%2594%25A1%25E5%25BE%2590%25E5%259D%25A4&rsv_btype=t&inputT=1356&rsv_t=30ce7B8KPAgBA5MzP%2Fj0%2Bouk7Tznt866T6e0B%2Fv5EUHIzUkxc34g%2BwyPnOzHtYLvNupJ&rsv_pq=b89a996d00b45a5c&rsv_sug3=38&rsv_sug1=22&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1356&rsv_sug=1
因此,我们平时访问网站,本质上就是在进行进程间通信,只不是是跨网络的,通过域名转化为IP地址,端口号是协议默认的。
二、认识HTTP样例
如下是一个http请求样例,有 请求行、请求报头、空行、请求参数(请求参数可以为空)

GET 为http请求方法 / 为请求资源的目录(这是web更目录) HTTP/1.1是http协议版本。
请求报头中的内容我们暂时不管,等第三章来看,这里只是了解一下http的样子。

对于http协议,请求报头是按 "\r\n" 做结尾的,因此可以通过读取到空行的"\r\n"表示读完了请求报头。而正文(请求参数)的读取完毕,是在请求报头中有一个参数Content_Length来表示正文的长度,知道了长度之后,再拿着这个长度去读正文,读到了这个长度表示正文读取完毕。
反序列化也是按照"\r\n"来进行截取,至此服务器就能清楚我们的请求,同时给我们的请求做出响应。
其中http的响应字段也是类似的,其中浏览器会将响应正文做解释,就变成我们看到的网页了。

如下是http的响应字段

三、HTTP的报头内容
1.url
前面我们的请求行,中间的内容为目录,默认访问的是web根目录,代表默认访问该网站的首页

如果我们指定访问某个文件夹下某个资源,那么请求行中url内容也会随之改变,参数也可以这样传递

实际上我们可以通过http协议,截取出你的url是什么,如果是根目录,那么就拼接首页并给你首页网站。
如果是其他目录,只要我有该目录下的该文件,我就给你,如果没有,我就404 not fount。代码逻辑如下。


2. Content-Type
Content-Type 用于指示响应中包含的数据的类型,如果你的html里面有图片、视频等链接,http进行解析正文的时候发现有链接,那么他会再次发送请求该链接。如下

浏览器虽然足够智能,但是仍需要我们指定类型让浏览器进行渲染,因此我们需要给响应字段添加Content-Type,让浏览器知道如何渲染。
Content-Type 扩展名对照表
因此我们需要截取出请求报头中的url,分析url的后缀是什么,根据后缀进行返回内容

3.Method 方法
请求行的第一个参数就Method方法,最重要、也是最常见的是 GET 和 POST 。
我们通常使用GET 请求去获取资源,比如网页、图片等。
POST请求通常用于提交表单数据、上传文件等操作。
1.GET方法
GET方法请求参数通常以 URL 的查询字符串的形式附加在 URL 后面,html中如果不写method,默认方法也是“GET”

这样就可以通过截取的方式把用户输入的数据给到后台。后台根据数据再给你提供服务。
2.POST方法
post方法会将表单的请求参数放在正文部分,私密性会更强一些。

GET与POST的区别
- GET是在url传递参数,POST是在请求正文传参
- GET在url传参字节个数有限,POST参数字节没有限制
- GET请求通常用于请求服务器发送某个资源,POST请求通常用于向服务器提交数据
- GET私密性比POST差(私密性不等于安全性,GET和POST都不安全,都是明文传输,https才更安全)
4、状态码
在http的响应行中,有状态码这个东西,访问成功状态码是通常200。

如果你请求的文件不存在,状态码通常是404 ,描述为not fount

状态码并不是固定的,而是大多是大家默认遵守的规矩,你可以逾矩,但是会让其他程序员看不懂。 重定向是例外,不能乱写。

那我们就可以去进行各种判断,看是什么问题,然后给你返回对应的状态码与状态码描述。其他的我们都能理解,这个重定向状态码是什么情况呢?
HTTP报头中还有一个Location字段,客户端会根据该字段中指定的 URL 自动进行重定向,如下代码,当你的报头中状态码为307,并且有Location字段(缺一不可),其他内容也就不重要了,访问到这个网站即会重定向到你所设置的网站内。


其中307代表临时重定向,请求的资源暂时移动到了新位置,但所有后续的请求应该继续使用原始的 URL。
如果状态码是301,表示请求的资源已永久移动到新位置,且所有后续的请求应该使用新的 URL。这意味着浏览器在收到 301 响应后,应该自动更新其缓存的链接,并使用新的 URL 进行所有后续的请求。
5.cookie和session
- http的请求是无连接和无状态的。
- 无连接代表像服务器发送请求,服务器对你的请求做出响应,然后就结束了,后续你要再次跳转或者做其他操作又会发送新的请求。
- 无状态是说服务器根本就不知道你请求了多少次,你是一直在做刷新操作,还是只访问了一次,我不知道耶不关心,我只知道根据你的请求做出响应。
- 但是我们实际使用的时候,比如抖音登录成功后关闭抖音,再次访问,发现他还是记得我,我仍处于登录状态,这是cookie在起作用。
当我们将账号和密码输入给服务器时,服务器会将你的账号和密码与数据库做对比,如果发现有该用户,就会response响应用户登录成功了,同时该响应里面有Set-Cookie字段,该字段的内容就是你的账号和密码。
浏览器发现response响应里面有该字段,就会利用自动保存cookie字段,当用户再次访问该服务器时,浏览器会自动将cookie里面的内容取出,并帮我们在请求报头添加Cookie字段,该字段的内容就是你之前输入的账号和密码,这样我们第一次登录后,后面都不需要再次登录。

同时后续访问时,request请求报头就自动添加上了Cookie

但是如果仅仅只有cookie,有坏人想截取我的http请求可太简单了,直接获取到我的用户名和密码,拿着我的账号去干坏事,这样肯定不好。
因此服务器在我登录之后,会把我输入的数据保存到session中,同时通过键值对的唯一性,响应回来的Set-cookie为这个session的id值,这样客户端就收到一个Set-cookie:sessionid。以后就不用在明文传输,而是依靠这个sessionid进行验证用户了。
当然这样我们能保证自己的账号不会被盗,但是别人依然可以利用sessionid去干坏事,比如把账号里面的记录删一删等等,因此还是得需要服务器通过判断客户端的ip地址是否一致、或者sessionid持续时长等来更好的保护客户端(使用者)。
重要报头字段
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能
目前已经能通过http进行数据传输了,但是黑客仍然有各种办法截取用户的信息,因此需要对http进行加密,提出了https。https我们下一章见!!
相关文章:
Linux网络编程——HTTP协议的理解与运用
目录 前言 一、认识URL 二、认识HTTP样例 三、HTTP的报头内容 1.url 2. Content-Type 3.Method 方法 1.GET方法 2.POST方法 4、状态码 5.cookie和session 前言 我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们…...
RestTemplate接口请求发送json、form数据格式以及处理接口错误状态码400 null
在使用RestTemplate发送HTTP请求时,你可以通过不同的方式发送JSON或表单数据(application/x-www-form-urlencoded)。同时,处理接口错误状态码(如400)和返回null的情况也是很重要的。以下是一些示例代码&…...
《Python编程从入门到实践》day29
# 昨日知识点回顾 修改折线图文字和线条粗细 矫正图形 使用内置格式 # 今日知识点学习 15.2.4 使用scatter()绘制散点图并设置样式 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg)plt.style.use(seaborn-v0_8) # 使用内置格式 fig, ax plt.subpl…...
UIKit之图片浏览器
功能需求 实现一个图片浏览器,点击左右按钮可以切换背景图,且更新背景图对应的索引页和图片描述内容。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言,故创建cocoa Touch类…...
如何查看SNMP设备的OID
什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树,其级别由不同的组织分配。MIB MIB(管理信息基)提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…...
什么?你设计接口什么都不考虑?
如果让你设计一个接口,你会考虑哪些问题? 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制 返回值是否为空,如果为空的时候是…...
2024年3月 青少年等级考试机器人理论真题二级
202403 青少年等级考试机器人理论真题二级 第 1 题 一个机器小车,用左右两个电机分别控制左右车轮,左侧电机转速是100rpm,右侧电机转速是50rpm,则此机器小车?( ) A:原地右转 B&am…...
C语言学习【printf函数和scanf函数】
C语言学习【printf函数和scanf函数】 printf()函数和scanf()函数可以让用户与程序交流,是输入/输出函数 printf()函数 请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称…...
shell正则表达式
sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 sort 对行内容进行升序排序 XXX | sort 选项 sort 选项 文件 常用选项&#x…...
react组件渲染性能优化之函数组件-useCallback使用
useCallback主要就是对函数进行缓存,useCallBack这个Hooks主要是解决React.memo不能缓存事件的问题 useCallBack(fn, dependencies) :fn想要缓存的函数,dependencies有关是否更新 fn 的所有响应式值的一个列表 比如:UseCallBackOptimize组件…...
【C++】:string类的基本使用
目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…...
多线程的代码案例
目录 单例模式 饿汉模式 懒汉模式 阻塞队列 生产者消费者模型意义: 阻塞队列使用方法 实现阻塞队列 阻塞队列实现生产者消费者模型 定时器 实现简单的定时器 工厂模式 线程池 为啥呢? 从池子里面取 比 创建线程 效率更高 线程池的创建 怎么填坑 ThreadPoolExec…...
什么是Java中的设计模式?请列举几种常见的设计模式
一、引言 在软件开发中,设计模式是解决特定设计问题的最佳实践或通用解决方案。Java作为一种广泛使用的编程语言,其设计模式在软件设计和架构中起着至关重要的作用。设计模式不仅提高了代码的可读性和可维护性,还使得代码更加灵活和可扩展。…...
绘制奇迹:Processing中的动态图形与动画
🚀 欢迎回到Processing的世界,你的艺术编程航程刚刚开始。在我们的入门篇中,你已经学会了如何用Processing绘制基本的静态图形。现在,让我们一起探索Processing强大的动态图形和动画功能,释放你的创造力,走…...
Django视图Views
Views视图 HttpRequest 和HttpResponse Django中的视图主要用来接受web请求,并做出响应。视图的本质就是一个Python中的函数视图的响应分为两大类 1)以Json数据形式返回(JsonResponse) 2)以网页的形式返回 2.1)重定向到另一个网页 (HttpRe…...
国内智能搜索工具实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
WebSocket or SSE?即时通讯的应用策略【送源码】
最近在研究H5推送,发现除了我们常用的WebSocket以外,其实还有一种协议也能实现H5推送,那就是SSE协议。 而且,当前主流的大模型平台,比如ChatGPT、通义千问、文心一言,对话时采用的就是SSE。 什么是SSE协议…...
QT实现Home框架的两种方式
在触摸屏开发QT界面一般都是一个Home页面,然后button触发进入子页面显示,下面介绍这个home框架实现的两种方式: 1.方式一:用stackedWidget实现 (1)StackedWidget控件在Qt框架中是一个用于管理多个子窗口或…...
机器学习笔记03
1.线性回归(linear regression) 是利用回归方程(函数)对一个或者多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方法。 线性模型: 1.线性关系࿱…...
【全面介绍下Spring】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

