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

Linux网络HTTP(中)(8)

文章目录

  • 前言
  • 一、HTTP的方法
  • 二、HTTP的状态码
  • 三、HTTP常见的Header
  • 总结


前言

  承接上文,我们来继续深入讨论HTTP!


一、HTTP的方法

HTTP常见的方法如下:

方法说明支持的HTTP协议版本
GET获取资源1.0、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获得报文首部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINK断开连接关系1.0

其中最常用的就是 GET方法 和 POST方法

GET方法 和 POST方法

  GET方法 一般用于获取某种资源信息,而 POST方法 一般用于将数据上传给服务器。但实际我们上传数据时也有可能使用 GET方法 ,比如百度提交数据时实际使用的就是 GET方法

GET方法 和 POST方法 都可以带参:

  • GET方法 是通过 url 传参的
  • POST方法 是通过 正文 传参的

  从 GET方法 和 POST方法 的传参形式可以看出,POST方法 能传递更多的参数,因为 url 的长度是有限制的, POST方法 通过正文传参就可以携带更多的数据

  此外,使用 POST方法 传参更加私密,因为 POST方法 不会将你的参数回显到 url 当中,此时也就不会被别人轻易看到。不能说 POST方法 比 GET方法 更安全,因为 POST方法 和 GET方法 实际都不安全,要做到安全只能通过加密来完成

  只能说 POST方法 来得更加的隐私,至少不会让你登录某个网站提交账号密码的时候直接回显到 url 那里

  现在我用一个叫做 postman 的软件来演示一下,你就把这个 postman 当作是浏览器,由它来发起请求给服务器,就让它来给我们看看到底怎么个事儿~

  如果访问我们的服务器时使用的是 GET方法 ,此时应该通过 url 进行传参,可以在 Params 下进行参数设置,因为 Postman 当中的 Params 就相当于 url 当中的参数,你在设置参数时可以看到对应的 url 也在随之变化

在这里插入图片描述

  此时在我们的服务器收到的 HTTP请求 当中,可以看到请求行中的 url 就携带上了我们刚才在 Postman 当中设置的参数

在这里插入图片描述
  而如果我们使用的是 POST 方法,此时就应该通过正文进行传参,可以在 Body 下进行参数设置,在设置时可以选中 Postman 当中的 raw 方式传参,表示原始传参,也就是你输入的参数是什么样的实际传递的参数就是什么样的

在这里插入图片描述

  此时服务器收到的 HTTP请求 的请求正文就不再是空字符串了,而是我们通过正文传递的参数

在这里插入图片描述

用TCP套接字来表示GET和POST方法的区别

  要演示 GET方法 和 POST方法 传参的区别,就需要让浏览器提交参数,此时我们可以在 index.html 当中再加入两个表单,用作用户名和密码的输入,然后再新增一个提交按钮,此时就可以让浏览器提交参数了

  我们可以通过修改表单当中的 method属性 指定参数提交的方法,还有一个属性叫做 action ,表示想把这个表单提交给服务器上的哪个资源

在这里插入图片描述

  此时当我们用浏览器访问我们的服务器时,就会显示这两个表单

在这里插入图片描述
  当前我们是用 GET方法 提交参数的,当我们填充完 用户名和密码 进行提交时,我们的 用户名和密码 就会自动被同步回显到 url 当中

在这里插入图片描述

  同时在服务器这边也通过 url 收到了刚才我们在浏览器提交的参数

在这里插入图片描述
  如果我们将提交表单的方法改为 POST方法 ,此时当我们填充完 用户名和密码 进行提交时,对应提交的参数就不会在 url 当中体现出来,而会通过正文将这两个参数传递给了服务器

在这里插入图片描述
  此时 用户名和密码 就通过正文的形式传递给服务器了

在这里插入图片描述

二、HTTP的状态码

HTTP的状态码如下:

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

  最常见的状态码,比如200(OK),404(Not Found),403(Forbidden请求权限不够),302(Redirect),504(Bad Gateway)。

Redirection(重定向状态码)

  重定向就是通过各种方法将各种网络请求重新定个方向转到其它位置,此时这个服务器相当于提供了一个引路的服务

  重定向又可分为 临时重定向 和 永久重定向 ,其中 状态码301 表示的就是 永久重定向 ,而 状态码302 和 307 表示的是 临时重定向

   临时重定向 和 永久重定向 本质是影响客户端的标签,决定客户端是否需要更新目标地址。如果某个网站是永久重定向,那么第一次访问该网站时由浏览器帮你进行重定向,但后续再访问该网站时就不需要浏览器再进行重定向了,此时你访问的直接就是重定向后的网站。而如果某个网站是临时重定向,那么每次访问该网站时如果需要进行重定向,都需要浏览器来帮我们完成重定向跳转到目标网站

下面是 DeepSeek 给出的实际例子

在这里插入图片描述
   现在我进行一个临时重定向演示,把跳转后的新页面设置成 CSDN 的首页

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>using namespace std;int main()
{// 创建套接字int listen_sock = socket(AF_INET, SOCK_STREAM, 0);if (listen_sock < 0){cerr << "socket error!" << endl;return 1;}int opt = 1;setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));// 绑定struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(8081);local.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(listen_sock, (struct sockaddr*)&local, sizeof(local)) < 0){cerr << "bind error!" << endl;return 2;}// 监听if (listen(listen_sock, 5) < 0){cerr << "listen error!" << endl;return 3;}// 启动服务器struct sockaddr peer;memset(&peer, 0, sizeof(peer));socklen_t len = sizeof(peer);for (;;){int sock = accept(listen_sock, (struct sockaddr*)&peer, &len);if (sock < 0){cerr << "accept error!" << endl;continue;}if (fork() == 0){ // 爸爸进程close(listen_sock);if (fork() > 0){ // 爸爸进程exit(0);}// 孙子进程char buffer[1024];recv(sock, buffer, sizeof(buffer), 0); // 读取HTTP请求cout << "--------------------------http request begin--------------------------" << endl;cout << buffer << endl;cout << "---------------------------http request end---------------------------" << endl;// 构建307临时重定向响应string status_line = "HTTP/1.1 307 Temporary Redirect\r\n";	// 状态行:307临时重定向string response_header = "Location: https://www.csdn.net\r\n";	// 重定向到CSDN首页response_header += "Content-Type: text/html\r\n";string blank = "\r\n";											// 空行string response_text = "<html><body><h1>307 Temporary Redirect</h1><p>Redirecting to <a href='https://www.csdn.net'>CSDN</a></p></body></html>"; // 响应正文(用户看到的内容)string response = status_line + response_header + blank + response_text; // 响应报文// 响应HTTP请求std::cout << "响应内容是: \n" << response << std::endl;send(sock, response.c_str(), response.size(), 0);close(sock);exit(0);}// 爷爷进程close(sock);waitpid(-1, nullptr, 0); // 等待爸爸进程}return 0;
}

   此时运行我们的服务器,当我们用 telnet 命令登录我们的服务器时,向服务器发起 HTTP 请求时,此时服务器给我们的响应就是 状态码307 ,响应报头当中是 Location字段 对应的就是 CSDN首页 的网址

在这里插入图片描述

   看图标是CSDN的图标,因为我刚刚重定向过,很神奇吧!

三、HTTP常见的Header

HTTP常见的Header如下:

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

Host

   Host字段 表明了客户端要访问的服务的 IP 和 端口 ,比如当浏览器访问我们的服务器时,浏览器发来的 HTTP请求 当中的 Host字段 填的就是我们的 IP和端口 。但客户端不就是要访问服务器吗?为什么客户端还要告诉服务器它要访问的服务对应的 IP 和 端口

   因为有些服务器实际提供的是一种代理服务,也就是代替客户端向其他服务器发起请求,然后将请求得到的结果再返回给客户端。在这种情况下客户端就必须告诉代理服务器它要访问的服务对应的 IP 和 端口 ,此时 Host 提供的信息就有效了

User-Agent

   User-Agent 代表的是客户端对应的操作系统和浏览器的版本信息。

   比如当我们用电脑下载某些软件时,它会自动向我们展示与我们操作系统相匹配的版本,这实际就是因为我们在向目标网站发起请求的时候, User-Agent字段 当中包含了我们的主机信息,此时该网站就会向你推送相匹配的软件版本。

在这里插入图片描述

Referer

   Referer 代表的是你当前是从哪一个页面跳转过来的, Referer 记录上一个页面的好处一方面是方便回退,另一方面可以知道我们当前页面与上一个页面之间的相关性。

Keep-Alive(长连接)

   HTTP/1.0 是通过 request & response 的方式来进行请求和响应的, HTTP/1.0 常见的工作方式就是客户端和服务器先建立链接,然后客户端发起请求给服务器,服务器再对该请求进行响应,然后立马断开端口连接

  但如果一个连接建立后客户端和服务器只进行一次交互,就将连接关闭,就太浪费资源了,因此现在主流的 HTTP/1.1 是支持长连接的。所谓的长连接就是建立连接后,客户端可以不断的向服务器一次写入多个 HTTP请求 ,而服务器在上层依次读取这些请求就行了,此时一条连接就可以传送大量的请求和响应,这就是长连接

  如果 HTTP请求或响应报头 当中的 Connect字段 对应的值是 Keep-Alive ,就代表支持长连接

在这里插入图片描述


总结

  好了本篇就到这里,其实你有没有想过一个问题,假设我们现在登录B站,输入账号密码,后面很长一段时间在本机上就直接不用输入了,这是为什么呢,我将留到下篇再来解答,嘻嘻!

http://www.dtcms.com/a/503207.html

相关文章:

  • wordpress老站开启多站点wordpress评论是关闭还是开启
  • 建设宣传网站上的请示邯郸网站建设哪能做
  • Linux 例行性工作任务(定时任务)知识点总结
  • 一文学会大模型开发Eino框架的模型调用方法
  • Docker命令大全:从入门到精通
  • 沈阳网站制作公司思路留学网站建设
  • js封装一个双精度算法实现
  • 性能优化:提升软件效率的实用指南
  • 【FPGA】设计流程——Veriolg输入
  • 公共交通安全再讨论
  • C++蓝桥杯之结构体10.15
  • 从原理到实战:Java 队列(Queue)指南
  • 【C++】用红黑树封装map与set
  • php网络公司网站源码网站建设与管理的体会
  • 做网站要先申请域名吗做彩铃的网站
  • 零基础做地方门户网站装修网名大全
  • Docker入门手册
  • 谷歌 Gemini 2.5 Flash Image 震撼升级图像编辑
  • Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
  • [go 面试] 并发与数据一致性:事务的保障
  • gitee——代码托管平台(进行托管所需的相关软件)
  • JavaWeb后端-Maven、单元测试
  • 微网站后台怎么注册有哪些公众号是小黄油的
  • 【SayCan】LLM+价值函数:以言为引,量力而行
  • 做亚马逊外国网站需要语言好吗大都会app约
  • DaVinci4.2.3 | 无限次AI图片生成,可以预制多种风格,提示限制清理数据重新进即可
  • Linux 配置双栈协议(IPv4 + IPv6)详解
  • JAVA全栈JVM篇————初识JVM
  • 在PyTorch中实现自定义损失函数
  • Hoeffding树:数据流挖掘中的高效分类算法详解