HTTP请求

目录

HTTP 请求

请求格式

请求行

请求报头(header)

空行

请求正文(body)

认识方法(Method)

GET

POST

PUT

DELETE

GET 和 POST 的区别是什么?

URL

详解常见的请求报头(header)

Host(表示服务器主机的 IP 地址和端口号)

Content-Length(表示请求正文 body 中的数据长度,单位是字节)

Content-Type(表示请求正文 body 中的数据格式)

User-Agent(记录操作系统的信息和浏览器的信息)

Referer(记录当前这个页面是由哪个页面跳转过来的)

Cookie(很重要)

什么是 Cookie?

Cookie 从哪里来?

Cookie 怎样存储?

Cookie 到哪里去?

Cookie 的一个核心功能

HTTP 请求

请求格式

请求格式

报文层级组成要素 / 示例内容关联知识点 / 对应方法说明
请求行

*Request Line*
Method URL Version

例如:POST /api/blog/info HTTP/1.1
规定了本次请求的行为、目标路径及协议版本。
请求报头

*Request Headers*
Key: value

Key: value

Key: value

Key: value

例如:Content-Type: application/json
向服务器传递附加信息,如客户端环境、数据格式、Cookie、Token 认证等。
空行

*Blank Line*
\r\n

(回车符 + 换行符)
关键分隔符:用于告知服务器请求头已经结束,下方开始解析请求正文。
请求正文

*Request Body*
请求正文内容

(具体传输的数据)
并不是所有请求方法都带正文,不同方法的行为也不同:

GET:通常无正文,数据直接拼接在 URL 后面。

POST:用于传输实体主体,如表单、JSON 数据。

PUT:用于传输文件或更新资源,具有幂等性。

DELETE:用于删除文件或资源。

Get请求例子:

GET https://www.baidu.com/favicon.ico HTTP/1.1
Host: www.baidu.com
Cookie: BAIDUID=0DC17694BE3C92702FBF070D60B4328A:FG=1
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en,*
User-Agent: Mozilla/5.0

POST 请求例子:

POST 请求例子

请求行
GET https://www.baidu.com/favicon.ico HTTP/1.1

1. Method 是 HTTP 请求的类型

GET

2. URL 是统一资源定位符

https://www.baidu.com/favicon.ico

3. Version 表示协议版本

HTTP/1.1
请求报头(header)
Host: www.baidu.com
Cookie: BAIDUID=0DC17694BE3C92702FBF070D60B4328A:FG=1
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en,*
User-Agent: Mozilla/5.0

请求报头是键值对的形式

键和值使用(冒号 + 空格)的形式来分开

空行

空行说明请求报头结束

请求正文(body)

请求正文可有,可没有

GET 请求一般没有 body 部分

认识方法(Method)
方法说明支持的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
UNLINE断开连接关系1.0
GET

获取的字面意思,表示要从服务器上获取资源

POST

发送的字面意思,表示向服务器发送资源

PUT

推送的字面意思,也是表示要向服务器发送资源之类的

DELETE

删除的字面意思,表示要删除服务器中的资源

在实际开发中,一般使用 GET 和 POST 比较多

在使用 HTTP 传输图片(二进制文件),将二进制数据转换成文本(使用 Base64 编码)

GET 和 POST 的区别是什么?
  1. GET 和 POST 没有本质上的区别,能用 GET 的也能用 POST,能用 POST 也能用 GET
  2. GET 表示获取数据的语义,POST 表示发送数据的语义
  3. GET 通常把传递给服务器的数据放到 query string
  4. POST 通常把传递给服务器的数据放到 请求正文(body)
URL

详解HTTP中的URL

详解常见的请求报头(header)

Host(表示服务器主机的 IP 地址和端口号)
Host: www.baidu.com

1. IP 地址由域名来表示,可以通过 DNS 服务器将域名解析到一个具体的 IP 地址
2. 端口号看使用协议的默认端口号,HTTP 协议默认是 80 端口,HTTPS 协议默认是 443 端口

Content-Length(表示请求正文 body 中的数据长度,单位是字节)
Content-Length: 9947
Content-Type(表示请求正文 body 中的数据格式)
Content-Type: application/x-www-form-urlencoded

常见的格式:

  • text/html:HTML 文档
  • text/css:CSS 样式表
  • application/javascript:JavaScript 脚本
  • application/json:JSON 数据
  • image/jpg:JPEG 图片
  • image/png:PNG 图片
  • text/plain:纯文本
User-Agent(记录操作系统的信息和浏览器的信息)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36
Referer(记录当前这个页面是由哪个页面跳转过来的)
Referer: https://www.baidu.com/

这个例子表明:当前这个页面是由百度首页跳转过来的

不是所有的请求都有 Referer,有页面的跳转才有 Referer

Cookie(很重要)
什么是 Cookie?

Cookie 是浏览器这端保存数据到本地的一种机制

Cookie 从哪里来?

Cookie 是服务器返回的

在响应报头中,服务器把要存储的 Cookie 通过 Set-Cookie 这样的键值对来返回

Set-Cookie: BAIDUID=4447D7823D6ECEC2AF92E74C71314B14: FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=4447D7823D6ECEC2AF92E74C71314B14; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1775661838; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=4447D7823D6ECEC2D26C2BF8D1F29A08:FG=1; max-age=31536000; expires=Thu, 08-Apr-27 15:23:58 GMT; domain=.baidu.com; path=/; version=1;
Cookie 怎样存储?

通过键值对的方式来存储

对于不同的浏览器,它们各自存储的 Cookie 之间是完全隔离的,不会相互影响

Cookie: BIDUPSID=0537CFCD4BBBF69AC8E66910DB3172AE; PSTM=1762876370; BAIDUID=0537CFCD4BBBF69AC8E66910DB3172AE:FG=1; BD_UPN=12314753; BDUSS=TJydTJyZ35yNS0zY3gxeG4yWTNEQVVYQnIybkxXMmhYeFgwRTQyeWliQkRoejlwSUFBQUFBJCQAAAAAAQAAAAEAAAA6QCpFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEP6F2lD-hdpS;
Cookie 到哪里去?

当一个浏览器的 Cookie 存储到本地之后,后续再访问同一个域名的时候,Cookie 就会通过请求报头的形式传递给服务器

Cookie 的一个核心功能

保存用户的登录状态,避免重复登录

再来看这一张思维导图来回顾上面提到的知识:

内容概要:本文通过一个典型的嵌入式开发困境——因供应链问题需紧急更换传感器芯片,引出使用C语言实现工厂模式来解决代码强耦合问题。文章首先介绍如何利用C语言的结构体和函数指针模拟面向对象中的“接口”概念,定义统一的传感器操作接口(Sensor_Ops),实现业务层与具体驱动的解耦。接着展示“青铜段位”的简单工厂模式,通过switch-case根据宏定义选择具体传感器实现,使更换芯片只需修改一行代码。进一步,文章引入“王者段位”的自动注册工厂模式,利用编译器的section特性,将各传感器驱动的操作集自动注册到指定内存段,工厂通过遍历该段自动发现所有可用传感器,真正实现了“对扩展开放,对修改关闭”的开闭原则。最后阐述了该模式在硬件模拟(Mock)、多版本兼容和团队协作方面的实战价值。; 适合人群:从事嵌入式系统开发,具备一定C语言基础和项目经验的工程师,特别是常面临硬件变更、多型号产品维护或团队协作开发的从业者。; 使用场景及目标:①当项目中存在同类外设(如传感器、显示屏、存储芯片)多种选型,需要灵活切换时;②希望实现硬件抽象,便于在无实物硬件时进行软件仿真和单元测试;③构建多硬件版本产品(如Pro/Lite版),用一套代码库支持不同配置;④促进团队分工协作,降低驱动开发与业务逻辑之间的依赖和冲突。; 阅读建议:此资源不仅提供了代码范例,更重要的是传达了一种解耦和模块化的设计思想。建议读者在理解基本原理后,动手实践,尝试在自己的项目中应用简单工厂模式,并逐步过渡到自动注册模式,同时思考如何将此思想推广到其他模块(如通信、存储等)的设计中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值