当前位置: 首页 > news >正文

http协议补充

7.7实现http请求

class httprequest
{
public:
    void Deserialize(std::string content)
    {
        while (true)
        {
            auto pos = content.find(sep);
            if (pos == std::string::npos)
            {
                break;
            }
            std::string temp = content.substr(0, pos);
            if (temp.empty())
            {
                break;
            }
            req_header_.push_back(temp);
            content.erase(0, pos + sep.size());
        }
        auto pos = content.find(sep);
        text_ = content.substr(pos + sep.size());
    }
    void parse()
    {
        std::stringstream sstr(req_header_[0]);
        sstr >> method_ >> url_ >> httpversion_; // 默认以空格分割
        path_ = wwwroot;
        if (url_ == "/" || url_ == "/index.html")
        {
            path_ += "/";
            path_ += homepage;
        }
        else
        {
            path_ += url_;
        }
    }
    void debugprint()
    {
        std::cout << "---------------------" << std::endl;
        for (auto &e : req_header_)
        {
            std::cout << e << std::endl;
        }
        std::cout << text_ << std::endl;
        std::cout << "method: " << method_ << std::endl;
        std::cout << "url: " << url_ << std::endl;
        std::cout << "http_version: " << httpversion_ << std::endl;
        std::cout << "path: " << path_ << std::endl;
        std::cout << "---------------------" << std::endl;
    }

public:
    std::vector<std::string> req_header_;
    std::string text_;

    std::string method_;
    std::string url_;
    std::string httpversion_;
    std::string path_;
};

7.8http细节

http的方法

GET 获取资源
//提交的参数使用拼接到url结尾的方式提交;参数数量受限且不安全;
POST 传输实体主体
//提交的参数是放在了请求正文部分;
CONNECT 用隧道协议建立代理

​ 数据都是通过表单提交的;

http状态码

在这里插入图片描述

​ 常见的如200 OK,404 Not Found;

​ 对于浏览器标准是有点的,但是支持的并不是很好;

​ 对于重定向包括临时重定向和永久重定向,浏览器发送请求,服务器不是直接提供服务,而是返回一个响应;响应报头是3XX,location里是一个新的地址;浏览器收到后会重新向新地址发起一个请求;

​ 临时重定向就是还是每次都要先访问服务器,然后服务器重定向,使用场景如:登录界面成功后跳转;

response_line = "HTTP/1.0 302 Found\r\n";
std::string response_header = "Content-Length: ";
response_header += std::to_string(text.size());
response_header += "\r\n";
response_header += "Location: https://www.qq.com\r\n";
response_header += "\r\n";

http常见的报头

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

​ 一个页面是包含非常多的元素的,每个元素就是一个资源;

​ 对于一个请求响应一个资源,然后关闭连接是短连接,http/1.0支持的就是短连接;而只建立一个连接,发送多个请求和响应是长连接,http/1.1支持的就是长连接;

​ http协议默认是无状态的;http有对登录用户的会话保持功能;

​ 响应报头中有Set - Cookie字段,设置了属性值,发送给浏览器保存起来,这种保存了属性值的文件叫做cookie文件;浏览器每一次向该服务发起请求时,都会携带cookie文件中的内容;保存cookie文件一般有有文件级的方式iye有内存级的方式;对于内存级设计,浏览器启动后就变成了一个进程,在进程当中是可以new空间的,可以将cookie的内容保存在进程的内存当中,不往磁盘上写;如果是文件级设计会直接将cookie信息保存到文件当中;这个文件被保存的浏览器特定的安装路径下; cookie文件会自动删除;

相关文章:

  • TDK超高压陶瓷电容的国产替代---赫威斯电容HVC Capacitor
  • Linux: module: dump_pagetables: Unknown symbol init_top_pgt (err 0)
  • rust - 常用时间处理
  • React中使用antDesign框架
  • 超图打开不同格式的dem文件
  • Navicat 干货 | 通过检查约束确保 PostgreSQL 的数据完整性
  • Python位操作指南:从基础到应用
  • 【黑马头条】-day04自媒体文章审核-阿里云接口-敏感词分析DFA-图像识别OCR-异步调用MQ
  • 新能源充电桩站场AI视频智能分析烟火检测方案及技术特点分析
  • ctf题目
  • 【C++】C到C++的入门知识
  • Lua热更新(xlua)
  • 解锁背包问题:C++实现指南
  • pytorch中torch.stack()用法虽简单,但不好理解
  • Vue3中如何挂载全局属性
  • 基于Python的电商特产数据可视化分析与推荐系统
  • debian12,linux-image-6.6.13+bpo-amd64内核nvidia显卡驱动失效
  • Uibot6.0 (RPA财务机器人师资培训第4天 )批量开票机器人案例实战
  • XUbuntu22.04之激活Linux最新Typora版本(二百二十五)
  • 一些基本类上实用的注解及例子
  • 首家股份行旗下AIC来了,兴银金融资产投资有限公司获批筹建
  • 全国铁路五一假期累计发送1.51亿人次,多项运输指标创历史新高
  • 4月外汇储备增加410亿美元,黄金储备连续6个月增加
  • 甘怀真:天下是神域,不是全世界
  • 吴清:推动公募基金高质量发展的行动方案今天将会发布
  • 十四届全国政协原常委、民族和宗教委员会原副主任苟仲文被提起公诉