HTTP请求就像你给服务器发的“一封信”,信封上写着地址和附加信息,信封里装着你要发的具体内容。整个请求分为三部分:请求行(相当于信封上的“收件地址和动作”)、请求头(相当于信封上的“备注信息”)、请求体(相当于信封里的“具体内容”)。
一、HTTP请求的整体结构
就像写信的格式固定一样,HTTP请求也有严格的“格式规矩”:
请求行:第一行,告诉服务器“你要做什么”和“目标是谁”。
比如:POST /user/login HTTP/1.1
前半部分是“动作”(POST/GET等方法),中间是“目标地址”(比如/user/login),最后是“协议版本”(比如HTTP/1.1)。
请求头:从第二行开始,一堆“键值对”,相当于给服务器的“附加说明”。
比如“我用的浏览器是Chrome”“我能接收JSON格式的数据”“我这次请求带了Cookie”等,每行一个说明,用:分隔(比如User-Agent: Chrome/100.0.0.0)。
请求体:请求头结束后,空一行,后面的内容就是请求体,也就是你要发给服务器的“实际数据”(比如登录时的账号密码)。
注意:GET请求没有请求体(数据在URL里),POST/PUT等请求才有。
二、请求头:服务器的“说明书”
请求头是一堆“键值对”,核心作用是让服务器知道“怎么处理这个请求”。常见类型(按功能分):
标识客户端信息
User-Agent:告诉服务器“我是谁”(比如“Chrome浏览器”“iPhone的Safari”),服务器据此返回适合的页面(比如移动端页面)。Accept:告诉服务器“我能看懂什么格式”(比如Accept: application/json表示只接受JSON数据,不接受HTML)。
控制数据传输
Content-Type:如果有请求体,这个头必须写,告诉服务器“请求体是什么格式”(比如application/json表示请求体是JSON字符串,multipart/form-data表示有文件上传)。Content-Length:告诉服务器“请求体有多长”(多少字节),方便服务器完整接收。
身份和状态关联
Cookie:客户端存储的“身份凭证”(比如登录后的SessionID),服务器靠这个认出“你是谁”。Authorization:用于身份验证(比如接口调用时的Token,格式可能是Bearer xxxxx)。
缓存和连接控制
Cache-Control:告诉服务器“这个请求要不要缓存”(比如no-cache表示不缓存,每次都要新鲜数据)。Connection:控制连接是否保持(比如keep-alive表示请求完不关闭连接,下次继续用,节省时间)。
三、请求体:要发的“具体内容”
请求体是实际传给服务器的数据,格式由Content-Type头决定,常见类型:
表单数据(最常见)
application/x-www-form-urlencoded:普通表单提交(比如登录页的账号密码),格式像username=zhangsan&password=123,适合简单键值对。multipart/form-data:带文件的表单(比如上传头像),数据会分成多个“块”,每个块有自己的描述(比如文件名、类型),能同时传文字和文件。
JSON数据
application/json:现在接口开发最常用的格式,数据是JSON字符串(比如{"name":"张三","age":20}),适合复杂结构(嵌套对象、数组),Java里常用@RequestBody接收。
纯文本或二进制
text/plain:纯文本(比如简单的字符串消息)。application/octet-stream:二进制数据(比如直接传文件内容,不附带额外信息)。
对Java开发的意义
写接口时,通过request.getHeader("xxx")可以拿到请求头(比如获取Token验证身份)。接收请求体时,SpringMVC会根据Content-Type自动解析:JSON用@RequestBody转成对象,表单用@RequestParam或表单对象接收。发送请求(比如用RestTemplate)时,必须正确设置请求头(尤其是Content-Type),否则服务器会“看不懂”数据。
简单说:请求行定“动作和目标”,请求头定“规则和说明”,请求体定“实际内容”——三者配合,才能让服务器准确理解你的需求。