十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HTTP——服务端、客户端格式,浏览器解析

HTTP——服务端、客户端格式,浏览器解析 bit::Shadow✧(≖ ◡ ≖✿目录浏览器作为客户端我的代码作为服务端。抓取浏览器的HTTP格式的请求请求行格式请求行请求头空行正文请求方RequestPOST举例Login.html见资源绑定测试服务端应答状态行响应报头响应正文最重要、最核心本质最基本的浏览器响应浏览器的强大解析能力[了解]html及图片显示gitee浏览器作为客户端我的代码作为服务端。链接过程如下我的浏览器(Win) |发送HTTP请求到 122.152.208.179:8080公网IP服务端开放端口号 | 互联网路由 |路由转发 云服务商网络 |防火墙允许8080端口 云服务器122.152.208.179 |操作系统将数据交给监听8080的进程 | 你的serverTCP程序 |解析HTTP请求 返回HTTP响应 |原路返回 浏览器显示内容抓取浏览器的HTTP格式的请求GET /favicon.ico HTTP/1.1 Host: 122.152.208.179:8080 Connection: keep-alive User-Agent: Mozilla/5.0 (Linux; Android 15; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36 Accept: image/avif,image/webp,image/apng,image/svgxml,image/*,*/*;q0.8 Referer: http://122.152.208.179:8080/wwwroot/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9,en-US;q0.8,en;q0.7 [空行] [正文](选择性)请求格式必然满足下图本质是字符数组请求行格式注意请求行格式顺序请求方法-[空格]-[URI]-[空格]-HTTP版本-换行符将请求内容通过read()读取后输出void Start(std::unique_ptrSocketClass clientfd) { _clfd clientfd-sockfdGet (); // 回显浏览器请求至于显示器 char buf[8096] { 0 }; int n read (_clfd, buf, 8095); if(n 0) { //也可能读不全!!!尝试直接输出 LOG (LogLevel::DEBUG) ; std::cout buf; LOG (LogLevel::DEBUG) ; } else if(n 0) { LOG (LogLevel::INFO) 客户端已退出; exit (0); } else RETFATAL (read); }得到GET / HTTP/1.1 Host: 122.152.208.179:8082 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9,en-US;q0.8,en;q0.7 ubuntuVM-0-11-ubuntu:~/e2026/Ubuntu_learning/Auguest/HTTP$表示我是Chrome浏览器用户使用Windows 10系统想要访问http://122.152.208.179:8082/我接受HTML页面和中文内容如果支持压缩更好。如果服务器支持HTTPS升级我也可以接受。请求行GET / HTTP/1.1GET请求方法表示客户端希望获取资源。/ : 请求的URI统一资源标识符“表示根路径”。HTTP/1.1使用的HTTP版本。请求头Host: 122.152.208.179:8082 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9,en-US;q0.8,en;q0.7字段值含义Host122.152.208.179:8082必填。指定目标服务器地址和端口支持虚拟主机Connectionkeep-alive保持TCP连接复用避免每次请求重新建立连接Upgrade-Insecure-Requests1告诉服务器客户端支持升级到HTTPS如果服务器支持User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...客户端标识Windows 10系统Chrome 151版本基于WebKit内核Accepttext/html,application/xhtmlxml,application/xml;q0.9,...告诉服务器客户端可接受的响应内容类型按优先级排序q值表示权重q0.9优先Accept-Encodinggzip, deflate客户端支持的压缩算法服务器可用这些算法压缩响应体Accept-Languagezh-CN,zh;q0.9,en-US;q0.8,en;q0.7客户端偏好的语言中文优先英文其次空行[空行]请求头之后必定有一个空行表示请求头结束。之后若存在请求体正文如POST表单的请求数据则放在空行之后。由于此处是GET方法所以一定无正文正文请求方Request情况是否有正文说明示例GET❌获取资源访问网页POST✅传输实体提交表单、上传文件HEAD❌获得报文首部只获取响应头DELETE❌删除文件删除资源PUT✅传输文件更新资源PATCH✅部分更新70%为GET20%为POST10%为其他。POST举例Login.htmlPOST常用于像服务端提交数据提交表单、文件上传、API调用等。见资源绑定测试效果图演示当我们输入登录信息即传输数据浏览器请求如下POST /login HTTP/1.1 Host: 122.152.208.179:8085 Content-Type: application/x-www-form-urlencoded Content-Length: 43 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8 Accept-Language: zh-CN,zh;q0.9 Accept-Encoding: gzip, deflate, br Connection: keep-alive Upgrade-Insecure-Requests: 1 usernameSaladpassword2024019rememberno最后一行即请求正文usernameSaladpassword2024019rememberno即请求正文未加密因为使用的是http在html内即注意GET与POST均不安全均可以被抓包获取因此常使用https来加密处理。服务端应答基本应答内容块状态行HTTP版本-[空格]-[状态码]-[空格]-状态码描述-换行符响应报头描述客户端、服务端、响应正文、甚至时间等等信息。响应正文最重要、最核心是传输到客户端(浏览器)供给解析的内容。因此为兼容多种格式像html、cs、js等我们使用二进制读取的方法。#includefstream bool ReadFile1(const std::string filename, std::string out) { std::ifstream file(filename, std::ios::in | std::ios::binary); if (!file.is_open()) { return false; } out.clear(); std::ostringstream buffer; buffer file.rdbuf(); if (file.fail() !file.eof()) { return false; } out buffer.str(); return true; }在四大模块中无疑正文是最重要的部分它决定了响应什么。其次就是状态行的解释供浏览器识别版本协议等信息。自然最本质的底层信息的发送是基于网络的TCP/UDP协议实现的ta提供send与accept等接口联系了服务端与客户端本质由此可见http不过在TCP/UDP之上的封装而已而 js css html则称为“解释性语言”、“应用层开发语言”而C/C本质是“底层开发”。最基本的浏览器响应浏览器的响应解析必须是基于上图的特定格式因此有以下最简单格式// 最基本的 HTTP 响应 const char* minimalResponse HTTP/1.1 200 OK\r\n \r\n Hello World!;即响应行空行正文浏览器的强大解析能力[了解]由于浏览器的强大解析能力我们甚至在响应行可以删除部分元素状态行甚至可以变成这个样子都可以正常解析。HTTP/1 0 O感谢支持长期连载欢迎关注
返回列表