【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客户端-服务器模型,一次完整的HTTP通信包含客户端发起请求到服务器响应的全过程。
首先来看客户端发起的HTTP请求报文。请求报文由客户端(比如浏览器、App)向服务器发起,主要由四个部分构成:请求行、请求头、空行和请求体。
第一部分是请求行,主要功能是说明客户端对服务器资源执行的操作。它由方法(Method)、资源路径(Resource Path)、HTTP版本三个部分构成,每部分用空格隔开。
- 请求方法定义操作类型,比如常见的GET用于获取资源(像浏览器访问网页),POST用于提交数据(如登录时发送账号密码)。
- **URI(统一资源标识符)**即资源路径,标识请求针对的资源,例如
/api/user
指向用户数据接口。 - HTTP版本常见的有1.1、2.0等,例如
HTTP/1.1
表示使用该版本的通信规则。
第二部分是请求头,由多行key:value键值对组成,每行以回车换行(\r\n)符号分割,类似快递单上的额外备注信息,传递请求的附加信息。常见字段包括:
- User-Agent:告诉服务器客户端类型(如Chrome浏览器或手机App),方便服务器返回适配内容。
- Content-Type:说明请求体的数据格式,比如
application/json
表示请求体是JSON数据。 - Host:请求的服务器域名,用于区分同一IP下的不同站点。
- Accept:客户端能处理的媒体类型,如
text/html
表示可接收网页内容。 - Accept-Encoding:客户端支持的内容编码,如
gzip
表示可接收压缩数据。 - Authorization:用于身份验证的凭证(如登录令牌),服务器通过它识别用户权限。
- Cookie:客户端存储的会话信息(如登录态),服务器通过它维持用户会话。
每行\r\n
的作用像表格换行,确保每个键值对独立清晰。
第三部分是空行,仅有一个\r\n
,是请求头部和请求正文的分隔符,明确划分不同区域的界限。
第四部分是请求正文,存放客户端提交的数据,格式灵活,可以是普通字符串、JSON、XML等。例如登录时提交的账号密码(JSON格式)、上传文件的二进制数据,都通过请求正文传递给服务器,GET请求通常没有请求体。
服务器收到请求后,会返回响应报文,响应报文同样包含四个部分:
第一部分是状态行,格式为协议版本+状态码+状态短语,例如HTTP/1.1 200 OK
。
- 状态码是核心反馈结果:2xx表示成功(如200 OK),3xx表示重定向(如302 Found),4xx表示客户端错误(如404 Not Found资源不存在),5xx表示服务器错误(如500 Internal Server Error)。
第二部分是响应头,也是多行key:value键值对,传递结果附加信息。例如:
- Content-Type:响应体的数据类型(如
application/json
表示接口返回JSON数据)。 - Cache-Control:缓存策略(如
max-age=3600
表示客户端可缓存响应1小时)。 - Set-Cookie:服务器给客户端设置的Cookie(如登录态),用于维持会话。
- Access-Control-Allow-Origin:跨域资源共享策略(如
*
表示允许所有域名跨域访问)。
第三部分是空行,同样用\r\n
分隔响应头和响应体。
第四部分是响应体,是服务器返回的核心数据,可能是HTML页面代码、JSON接口结果、图片/视频二进制数据等。例如访问网页时,响应体包含HTML代码,浏览器解析后渲染页面。
二、HTTP有哪些请求方式?
面试官您好!HTTP请求方式是客户端对服务器资源的操作指令,不同方法对应不同语义,可按功能分为三类,同时涉及安全性和幂等性概念。
先明确两个核心概念:
- 安全性:是否会修改服务器资源状态(“读操作”安全,“写操作”不安全)。
- 幂等性:多次执行同一请求,服务器资源状态是否一致(幂等方法结果不变,非幂等可能改变)。
(一)读操作(安全、幂等)
-
GET
- 用途:获取资源(查数据),如浏览器访问网页
GET https://www.example.com
或API查列表GET /api/articles
。 - 特点:参数拼在URL(如
?id=123
),可缓存、易分享,但敏感数据易暴露(如密码不能用GET传递)。 - 安全/幂等:安全(仅读取)、幂等(多次请求结果一致)。
- 用途:获取资源(查数据),如浏览器访问网页
-
HEAD
- 用途:仅获取响应头(不返回正文),用于检查资源元数据(如
HEAD /file.zip
查看文件是否存在、大小)。 - 特点:轻量高效,常做“预检”(如下载大文件前确认信息)。
- 安全/幂等:安全(仅读头)、幂等(多次请求头信息不变)。
- 用途:仅获取响应头(不返回正文),用于检查资源元数据(如
(二)写操作(非安全,部分幂等)
-
POST
- 用途:提交数据创建资源(写操作),如登录表单
POST /api/login
、上传文件。 - 特点:数据放请求体(相对隐蔽),但非幂等(多次提交可能创建多条数据,如重复下单)。
- 安全/幂等:非安全(修改状态)、非幂等。
- 用途:提交数据创建资源(写操作),如登录表单
-
PUT
- 用途:全量更新资源(替换数据),如修改用户资料
PUT /api/user/123
(需传完整信息)。 - 特点:幂等(多次用相同数据更新,结果一致)。
- 安全/幂等:非安全(修改状态)、幂等。
- 用途:全量更新资源(替换数据),如修改用户资料
-
PATCH
- 用途:局部更新资源(修改部分字段),如改用户昵称
PATCH /api/user/123
(仅传{"nickname":"new"}
)。 - 特点:灵活高效,但非幂等(多次调用持续修改,如多次“积分+10”)。
- 安全/幂等:非安全、非幂等。
- 用途:局部更新资源(修改部分字段),如改用户昵称
-
DELETE
- 用途:删除资源,如删订单
DELETE /api/order/123
。 - 特点:幂等(多次删除结果一致,资源已删除)。
- 安全/幂等:非安全、幂等。
- 用途:删除资源,如删订单
(三)控制操作(安全、幂等)
- OPTIONS
- 用途:查询服务器支持的方法,常用于跨域预检(如前端发POST前,浏览器自动发OPTIONS询问权限)。
- 特点:无实际业务逻辑,仅协商规则。
- 安全/幂等:安全(不修改状态)、幂等。
实际场景选择:遵循RESTful规范,查数据用GET,创建用POST,全量更新用PUT,局部更新用PATCH,删除用DELETE。例如电商系统中,查商品用GET,下单用POST,改地址用PUT,删订单用DELETE,语义清晰且符合规范。
三、GET请求和POST请求的区别
面试官您好!GET和POST是最常用的HTTP方法,核心区别体现在用途、数据传递、安全、幂等性等方面,结合场景选择能避免设计误区。
(一)五大核心差异
维度 | GET | POST |
---|---|---|
核心用途 | 读资源(查数据,如查商品详情) | 写资源(提交数据,如下单、登录) |
数据位置 | 拼在URL(如?keyword=手机 ) | 放请求体(如JSON格式的账号密码) |
安全性 | 低(参数暴露在URL,易被记录) | 中(数据在体内,但HTTP不加密) |
幂等性 | 幂等(多次请求结果一致) | 非幂等(多次提交可能重复创建) |
缓存支持 | 可缓存(浏览器自动存URL响应) | 默认不缓存(需显式设置) |
(二)逐场景解析
-
用途与数据传递:
- GET适合读操作,如浏览网页
GET https://example.com/article/123
,参数在URL清晰可见,适合公开场景(如搜索关键词)。 - POST适合写操作,如登录
POST /api/login
,账号密码放请求体,避免暴露在URL(但需配合HTTPS加密才安全)。
- GET适合读操作,如浏览网页
-
安全性对比:
- GET的URL参数会被浏览器历史、服务器日志记录,公共网络下传敏感数据(如密码)风险极高。
- POST的数据在请求体,抓包工具虽能截取,但配合HTTPS加密(TLS层)可保障安全(如电商支付场景必须用POST+HTTPS)。
-
幂等性与缓存:
- GET幂等,多次刷新商品详情页不会改变服务器数据;POST非幂等,重复提交订单会生成多个记录。
- GET响应可被浏览器缓存,提升性能(如新闻列表页);POST默认不缓存,因写操作结果可能每次不同。
(三)典型场景选择
- 选GET:查公开数据(如商品搜索)、需缓存的页面(如静态资源)、支持书签分享的场景(如文章链接)。
- 选POST:提交敏感数据(如登录、支付)、传大量数据(如上传文件)、改变服务器状态的操作(如发布评论)。
反例提醒:避免用GET传密码(URL暴露风险),也不建议用POST做查询(违背语义,团队协作易困惑)。遵循HTTP方法的设计初衷,能让接口更健壮、易维护。
总结
HTTP报文结构是通信的“骨架”,请求方法是操作的“灵魂”,GET/POST的差异则是实际开发的“指南针”。理解这些细节,不仅能应对面试,更能在实际项目中设计出高效、安全的接口,例如通过请求头缓存控制提升性能,或用HTTPS+POST保障敏感数据传输。