Linux---HTTP协议

HTTP

HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,主要用于在Web浏览器和Web服务器之间传输数据。

一、认识URL

平时我们俗称的 " 网址 " 其实就是说的 URL

http请求样例

看起来是一行一行的,但是本质还是一个大字符串,中间以换行符分割,跟我们在自定义协议时操作一样,通过换行对字符串进行解析

如何理解web根目录?

web根目录实际就是服务器上的一个指定的目录,里面存放了所有http的资源,如果请求url= / ,我们请求的是默认首页,我们会对请求的路径进行拼接,从而找到服务器中的某个资源,其他情况也是同理,都需要服务器进行相关的路径处理。

std::string GetFileContent(std::string path) // 读相应目录下的文件资源
{std::ifstream in(path,std::ifstream::binary);std::string content;if (!in.is_open())return "";in.seekg(0,in.end);size_t n = in.tellg();in.seekg(0,in.beg);std::vector<char> v(n);in.read(v.data(),v.size());in.close();return std::string(v.begin(),v.end());
}std::string Handler(std::string &request)
{HttpRequest req;req.Deserialize(request);// 反序列化http请求req.Parse();// 解析 http 请求req.Debug();//创建响应报文std::string httpstatusline = "http/1.1 200 ok"; //响应行std::string content = GetFileContent(req.Path()); // 响应正文std::string httpheader = "Content-Length: " + std::to_string(content.size()) + "\r\n";// 相应报头httpheader += "\r\n"; // 空行std::string httpresponse = httpstatusline + httpheader + content;return httpresponse;
}

二、Get/post

我们上网不仅仅可以获取资源,也可以上传数据,可以结合html进行传参,如登录、注册、搜索等都需要我们向服务器传递数据。

Get:可以用来获取资源,也能用来传递参数

post:传递参数,通过正文进行传输

GET vs POST

  • GET用url进行传参,POST请求正文传参
  • url传参,字节个数有限制,POST方法,参数没有限制
  • GET私密性更差一些,因为输入的参数会回显出来

但是GET和POST都不安全,GET能被看到,POST是明文传输,可以被捕捉到,安全和加密有关

一些其他方法的介绍

方法说明支持的http版本
PUT传输文件1.0、1.1
HEAD获取报文首部1.0、1.1
DELETE删除文件1.1、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1

三、http的状态码

类别原因短语
1XXInformation (信息性状态码)接收的请求正在处理
2XXSuccess (成功状态码)请求正常处理完毕
3XXRedirection (重定向状态码)需要进行附加操作以完成请求
4XXClient Error (客户端错误码)服务器无法处理请求
5XXServer Error (服务器错误状态码)服务器处理请求出错

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway) 

简单说明一下:

  1. 1xx(信息性状态码):表示请求已经接收,继续处理。例如:
    • 100 Continue:客户端应继续其请求。
    • 101 Switching Protocols:服务器根据客户端的请求切换协议。
  2. 2xx(成功状态码):表示请求已经被成功接收、理解、并处理。例如:
    • 200 OK:请求成功,成功被服务器接收、理解、并接受。
    • 201 Created:请求已经被服务器接收并创建了新的资源。
    • 204 No Content:服务器成功处理了部分GET请求,但没有返回任何内容。
  3. 3xx(重定向状态码):表示请求需要进一步操作,以完成请求。例如:
    • 301 Moved Permanently:被请求的资源已永久移动到新位置,将来任何对此资源的引用都应该使用本响应返回的URI。
    • 302 Found(或302 Moved Temporarily):请求的资源现在临时从不同的URI响应请求。
  4. 4xx(客户端错误状态码):表示客户端的请求有问题。例如:
    • 400 Bad Request:请求错误,通常是访问的域名未绑定引起。
    • 403 Forbidden:禁止访问。
  5. 5xx(服务器错误状态码):表示服务器处理请求时出现了错误

这里挑几个重要的说一下

1、404 Not Found

当我们访问的资源不存在时,就会返回,具体的实现就是将正文部分的内容变成下面的网页内容

2、307 Temporary Redirect  临时重定向

需要配合报头"Location: 网页链接"使用

3、301 Moved Permanently  永久移动

用法和307相同,但是两者的应用场景不一样

307:应用于页面的跳转,比如跳转到登录或注册页面

301:应用于当网络域名改变/网站过期,可以通过它来重定向之前的链接,让它指向新的域名网址

四、http的报头字段

HTTP 常见 Header
  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
  • User-Agent: 声明用户的操作系统和浏览器版本信息
  • referer: 当前页面是从哪个页面跳转过来的
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能

注意:请求的所有资源都有后缀,后缀决定了文件的类型。浏览器可以通过正文部分的文件后缀知道文件类型,但是有些浏览器无法自动识别文件类型,需要通过Content-Type来获取文件类型,所以http有专门的文件后缀和Content-Type的映射表,下面是网上截取的一部分

五、Cookie和session

HTTP协议中的无连接和无状态是其两个重要特性。

  • 首先,无连接的含义是限制每次连接只处理一个请求。当服务器处理完客户的请求并收到客户的应答后,连接就会断开。这种设计方式的主要目的是节省传输时间,使得请求时建立连接,请求完成后释放连接,以便尽快将资源释放出来服务其他客户端。尽管无连接可以提高效率,但在某些情况下也可能导致额外的开销,因为每次请求都需要重新建立连接。然而,HTTP/1.1版本引入了Keep-Alive功能,使得客户端到服务器端的连接可以持续有效,当出现对服务器的后继请求时,可以避免重新建立连接。
  • 其次,无状态指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求会给我们发送数据过来,但是发送完不会记录任何信息。这意味着每个HTTP请求都是独立的,服务器不会记住前一个请求的状态或信息。这种设计方式简化了服务器的实现,并减轻了其负担,但也带来了一些问题。例如,由于每个请求都是独立的,单个请求所需要的所有信息都必须包含在请求中一次发送到服务器,这可能导致单个消息的结构变得复杂,需要支持大量的元数据。

为了解决HTTP无状态的问题,人们提出了多种方案,如使用cookie进行身份验证和状态管理。这样,服务器可以通过cookie来识别不同的客户端和它们的会话状态,从而在一定程度上模拟有状态的行为。

实际在使用浏览器访问网页时,尤其是那种需要vip身份才能访问特定资源的网站,都会要求我们去登录注册,用来标识每一个用户,但http是无状态的,即服务器不会记录用户的信息,所以每次我们在访问时,都需要发送身份信息,如果每次都需要用户手动输入,用户肯定会有砸掉电脑的冲动,所以浏览器可以用cookie对用户信息作记录,每次访问网页就可以自动帮我们在请求报文中加上我们的用户信息。

cookie分为内存级和文件级:

  • 内存级:将信息存放在浏览器进程的上下文中,只在进程运行时有效,一旦关闭再打开就失效了
  • 文件级:将信息存放在浏览器软件的特定目录的文件中,一直有效,除非手动删除/修改文件内容

通过把"Set-Cookie: username=zxws"这样的语句添加到http报头字段实现Cookie

这种基于Cookie实现的就是会话管理

但是这种会话管理并不安全,因为我们是用账户密码直接进行的http请求,很容易被别人拿到,为了加强安全性,我们一般将用户的账户和密码哈希成一个标识符sessionid,用它进行身份的验证

 附录

// HttpProtocol.hpp
// 仅仅是模拟实现最简单的http的请求和响应的基本功能
// 代码并不全面和严谨,仅仅是为了方便我们直观的认识和了解http底层到底是如何做的
// 可以用网络套接字通信模拟实现一个简单的http网页服务,有兴趣可以尝试一下
#pragma once
#include "TcpServer.hpp"
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
const std::string HttpSeq = "\r\n";
const std::string wwwroot = "./wwwroot";
const std::string homepage = "index.html";class HttpRequest
{
public:HttpRequest() : _path(wwwroot){}bool GetLine(std::string &request, std::string *line){auto pos = request.find(HttpSeq);if (pos == std::string::npos)return false;*line = request.substr(0, pos);request.erase(0, pos + HttpSeq.size());return true;}void Deserialize(std::string request){std::string line;bool ok = GetLine(request, &line);if (!ok)return;_req_line = line;while (1){ok = GetLine(request, &line);if (ok){if (line.empty()){_req_content = request;break;}else{_req_header.emplace_back(line);}}else{break;}}}void Parse(){ParseLine();if (_url == "/"){_path += _url;_path += homepage;}else{_path += _url; // ps:需要处理一些只有路径没有文件资源的问题}}std::string Suffix(){size_t pos = _path.rfind('.');if (pos == std::string::npos)return "";return _path.substr(pos + 1);}std::string GetFileContentHelper(const std::string &path){std::ifstream in(path, std::ifstream::binary);std::string content;if (!in.is_open())return "";in.seekg(0, in.end);size_t n = in.tellg();in.seekg(0, in.beg);std::vector<char> v(n);in.read(v.data(), v.size());in.close();return std::string(v.begin(), v.end());}std::string GetFileContent(){return GetFileContentHelper(_path);}void ParseLine(){std::stringstream ss(_req_line);ss >> _method >> _url >> _version;}std::string Path(){return _path;}void Debug(){std::cout << _req_line << std::endl;for (auto line : _req_header){std::cout << line << std::endl;}std::cout << _req_blank << std::endl;std::cout << _req_content << std::endl;// std::cout << _method << std::endl;// std::cout << _url << std::endl;// std::cout << _version << std::endl;}std::string Get_404(){return GetFileContentHelper("./wwwroot/404.html"); // 该404.html网页大家可以自己写}private:std::string _req_line;std::vector<std::string> _req_header;std::string _req_blank = "";std::string _req_content;// method url 版本号std::string _method;std::string _url;std::string _version;std::string _path;std::string _suffix;
};class HttpResponce
{
public:HttpResponce() : _version("http/1.1"), _status_code(200), _status_code_desc("ok"), _resp_blank("\r\n"){}void MakeStatusLine(){_status_line = _version + " " + std::to_string(_status_code) + " " + _status_code_desc;}void SetCode(int code){_status_code = code;}void SetDesc(const std::string &desc){_status_code_desc = desc;}void AddHeader(const std::string &header){_resp_header.emplace_back(header);}void AddContent(const std::string &content){_resp_content = content;}std::string Serialize(){std::string res = _status_line + HttpSeq;for (auto &header : _resp_header)res += header;res += _resp_blank;res += _resp_content;// std::cout << res << std::endl;return res;}private:std::string _status_line;std::vector<std::string> _resp_header;std::string _resp_blank;std::string _resp_content;std::string _version;          // 版本号int _status_code;              // 状态码std::string _status_code_desc; // 状态信息
};

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

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

相关文章

ubuntu20文件安装和卸载cuda11.6

搜索cuda 11.6 nvidia&#xff0c;进入官网https://developer.nvidia.com/cuda-11-6-0-download-archive 选择linux --> runfile 用安装包安装 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sudo s…

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

第二代增强-采购订单抬头子屏幕增强

文章目录 第二代增强-采购订单抬头子屏幕增强需求查找增强点创建项目增强子屏幕定义全局变量编写出口函数代码激活增强运行结果查看创建的采购订单底表数据 第二代增强-采购订单抬头子屏幕增强 需求 查找增强点 创建项目 增强子屏幕 定义全局变量 *&---------------------…

读书笔记——《高质量C++/C编程指南》(2)

目录 前言 命名规则 共性规则 简单的Windows应用程序命名规则 表达式和基本语句 运算符优先级 复合表达式 if语句 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 对if 语句的补充说明 循环语句的效率 for 语句的循环控制变量 s…

自动驾驶中常见坐标系极其转换

各个传感器坐标系 相机坐标系统 摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。 感知算法和相机相关的坐标系有图像坐…

Pandas进阶

文章目录 第1关&#xff1a;Pandas 分组聚合第2关&#xff1a;Pandas 创建透视表和交叉表 第1关&#xff1a;Pandas 分组聚合 编程要求 使用 Pandas 中的 read_csv() 函数读取 step1/drinks.csv 中的数据&#xff0c;数据的列名如下表所示&#xff0c;请根据 continent 分组并…

MySQL-ELK基础

1&#xff1a;什么是 ELK ELK是由一家elastic公司开发的三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。三个项目各有不同的功能&#xff0c;之后又增加了许多新项目, 于是 从5.X版本后改名为Elastic Stack Elastic S…

【JavaScript】内置对象 - Date 日期对象 ④ ( 制作倒计时页面 )

文章目录 一、倒计时页面实现1、需求分析2、计算秒数3、计算倒计时时间的 天 / 时 / 分 / 秒4、页面中显示倒计时时间 二、完整代码示例1、完整代码2、执行结果 Date 日期对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Da…

速卖通商品评论API(aliexpress.item_review)返回值全解析

在电商领域&#xff0c;用户评论对于产品的推广和销售具有极其重要的影响。速卖通&#xff08;AliExpress&#xff09;作为全球知名的跨境电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中aliexpress.item_review API允许开发者获取商品的评论信息。本文将…

品质为王:高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析

品质为王&#xff1a;高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析 在当今的健康产品市场中&#xff0c;高效溶解性鱼油胶囊以其独特的营养价值和吸收效率赢得了众多消费者的青睐。然而&#xff0c;要想在激烈的市场竞争中脱颖而出&#xff0c;产品的品质保证至关重要。其中&a…

深入理解WPF的ResourceDictionary

深入理解WPF的ResourceDictionary 介绍 在WPF中&#xff0c;ResourceDictionary用于集中管理和共享资源&#xff08;如样式、模板、颜色等&#xff09;&#xff0c;从而实现资源的重用和统一管理。本文详细介绍了ResourceDictionary的定义、使用和合并方法。 定义和用法 Res…

鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行

本篇有相当的难度&#xff0c;涉及用户栈和内核栈的两轮切换&#xff0c;CPU四次换栈&#xff0c;寄存器改值&#xff0c;将围绕下图来说明. 解读 为本篇理解方便&#xff0c;把图做简化标签说明: user:用户空间kernel:内核空间source(…):源函数sighandle(…):信号处理函数&a…

【操作系统】进程与线程概念基础知识

进程与线程概念基础知识 进程进程的概念进程控制块进程状态进程三状态模型挂起进程模模型进程的上下文切换进程控制 线程为什么引入线程线程的概念线程与进程的比较线程的上下文切换线程的实现 进程 进程的概念 1. 进程的定义&#xff1a; 进程是指一个具有一定独立功能的程序…

【面试干货】http请求报文的组成与作用?

【面试干货】http请求报文的组成与作用&#xff1f; 一、http 的请求报文组成二、请求行&#xff08;Request Line&#xff09;三、请求头部&#xff08;Request Headers&#xff09;四、请求体&#xff08;Request Body&#xff09;五、响应头部 &#xff08;Response Headers…

iframe的基本用法

一、背景 在web页面开发中,有时会遇到在一个应用A的页面中引用应用B的页面,此时就需要在应用A中使用iframe嵌入引用B的页面了,比如多租户的web应用,或者门户系统的智能客服助手弹框应用,博主也是在做通用智能客服应用的过程中用到了iframe。网络上有关iframe的信息虽然很…

银河麒麟桌面版开机后网络无法自动链接 麒麟系统开机没有连接ens33

1.每次虚拟机开机启动麒麟操作系统&#xff0c;都要输入账号&#xff0c;密码。 进入点击这个ens33 内网才连接 2. 如何开机就脸上呢&#xff1f; 2.1. 进入 cd /etc/sysconfig/network-scripts 2.2 修改参数 onbootyes 改为yes 2.3 重启即可 a. 直接重启机器查看是否正常&…

工程伦理课堂记录

文章目录 0. 导论0.1 工程伦理教育的意义0.2 工程伦理教育要实现的目标 1. 工程与伦理1.1 工程伦理学科的产生1.2 工程和技术1.3 工程概念的理解演进1.4 工程的过程1.5 工程的特点1.6 工程活动的七个维度总结 2. 伦理2.1 道德伦理的概念2.2 道德伦理的关系2.3 伦理规范2.4 伦理…

【吃透Java手写】2-Spring(下)-AOP-事务及传播原理

【吃透Java手写】Spring&#xff08;下&#xff09;AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类&#xff0c;定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…

Blender动画与云渲染:创造高质量作品的未来路径

Blender作为开源的3D图形软件&#xff0c;在多个领域广受欢迎。但随着项目复杂度提升&#xff0c;传统渲染方式受限。云渲染技术的兴起突破了这些限制&#xff0c;为创作者提供了更自由、高效的创作环境。 一、Blender动画项目的挑战 传统上&#xff0c;Blender动画渲染需要依…

代码审计-php篇之某CRM系统多处sql注入

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;3516 阅读时间: 35min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果…