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通信

相关推荐
神仙别闹9 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
deng-c-f10 小时前
Linux C/C++ 学习日记(49):线程池
c++·学习·线程池
南棱笑笑生10 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
ulias21210 小时前
C++ 的容器适配器——从stack/queue看
开发语言·c++
daidaidaiyu10 小时前
FFmpeg 关键的结构体
c++·ffmpeg
欧特克_Glodon11 小时前
C++医学图像处理经典ITK库用法详解<一>:图像输入输出模块功能
c++·图像处理·itk
爬山算法11 小时前
Netty(10)Netty的粘包和拆包问题是什么?如何解决它们?
服务器·网络·tcp/ip
一个不知名程序员www11 小时前
算法学习入门---priority_queue(C++)
c++·算法
Sleepy MargulisItG11 小时前
【Linux网络编程】应用层协议:HTTP协议
linux·服务器·网络·http
logic_512 小时前
静态路由配置
运维·服务器·网络