HTTP概述

HTTP

HTTP(超文本传输协议)

认识URL

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

urlencode和urldecode

像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现。

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.

转义的规则如下:

将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

例如:

"+" 被转义成了 "%2B"

urldecode就是urlencode的逆过程;

HTTP协议格式

HTTP请求

  1. 首行: 方法 + url + 版本

  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束

  3. 空行

  4. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个

    Content-Length属性来标识Body的长度;

HTTP响应

  1. 首行: 版本号 + 状态码 + 状态码解释

  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束

  3. 空行

  4. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在

    body中.

HTTP的方法

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

HTTP的状态码

最常见的状态码, 比如:

200(OK)

301(永久重定向)

  • 表明目标资源被永久的移动到了一个新的 URI,任何未来对这个资源的引用都应该使用新的 URI。
  • 308 的定义实际上和 301 是一致的,唯一的区别在于,308 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上。

302(临时重定向)

  • 状态码表示目标资源临时移动到了另一个 URI 上。由于重定向是临时发生的,所以客户端在之后的请求中还应该使用原本的 URI。
  • 由于历史原因,用户代理可能会在重定向后的请求中把 POST 方法改为 GET方法。如果不想这样,应该使用 307(Temporary Redirect) 状态码。

303

  • 303 状态码表示服务器要将浏览器重定向到另一个资源。从语义上讲,重定向到的资源并不是你所请求的资源,而是对你所请求资源的一些描述。
  • 比如303 常用于将 POST 请求重定向到 GET 请求,比如你上传了一份个人信息,服务器发回一个 303 响应,将你导向一个"上传成功"页面。

404

  • NOT FOUND 表示客户端请求的资源不存在

403 禁止访问

  • 禁止访问,服务器理解请求客户端的请求,但是拒绝执行此请求(比如权限不足,ip被拉黑。。。等一系列原因)

500

  • 表示服务器内部出错

503

  • 由于临时的服务器维护或者过载,服务器当前无法处理请求。. 这个状况是临时的,并且将在一段时间以后恢复。

HTTP常见Header

  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
  • 此处我们使用 8080 端口号启动了HTTP服务器. 虽然HTTP服务器一般使用80端口, 但这只是一个通用的习惯. 并不是说HTTP服务器就不能使用其他的端口号.

  • 使用chrome测试我们的服务器时, 可以看到服务器打出的请求中还有一个 GET /favicon.ico HTTP/1.1

    样的请求。

  • /favicon.ico 是一个网页的小图标,通常显示在浏览器的标签页上或书签栏中。它是一个小的图片文件,通常是 .ico 格式,但也可以是其他图像格式,如 .png.jpg。这个图标是网站身份的一部分,帮助用户在浏览多个标签页时快速识别不同的网站。

在后续的博客中我们会实现一个简单的HTTP通信

相关推荐
苏生Susheng1 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
dong_junshuai1 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
曹牧1 小时前
C#:文本文件读取
服务器·前端·c#
Ruiery1 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
分支预测失败1 小时前
RISC-V AIA 中断架构实战:从 PLIC 到 APLIC 与 IMSIC 的迁移
linux·后端
驭渊的小故事1 小时前
网络原理04(http协议详细解析3)(2000详细解析HTTPS的工作原理)
网络·网络协议·http
GeW1 小时前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux
snow@li1 小时前
服务器运维:Alibaba Cloud Linux 4 LTS 64位 根目录全景深度解析文章
linux·运维·服务器
雪的季节2 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++
苏生Susheng2 小时前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施