【Day31】Web 开发入门:HTTP 协议详解(请求 / 响应、状态码、请求头)

本文收录于「Java 学习日记:从入门到架构师」专栏,系统化记录 Java 全栈学习之路,关注专栏解锁更多 Java 基础、框架、底层原理干货~

一、为什么要学 HTTP 协议?

作为 Java 开发者,无论你是做后端接口开发、SpringBoot 项目实战,还是对接前端,HTTP 协议都是绕不开的核心基础。你写的 Controller 接口最终要通过 HTTP 协议对外提供服务,前端的每一次请求、后端的每一次响应,本质上都是 HTTP 协议的交互过程。

不懂 HTTP,你可能会遇到这些问题:

  • 前端传参后端收不到,排查半天不知道是请求头的问题;
  • 接口返回 404/500/403 状态码,只知道报错却不懂含义;
  • 做文件上传、跨域请求时,卡在协议层面无法推进。

今天这篇日记,我们就把 HTTP 协议的核心知识点讲透,从请求 / 响应结构、状态码到请求头,结合 Java 实战案例,让你真正理解并能用起来。

二、HTTP 协议核心认知:超文本传输协议

HTTP(HyperText Transfer Protocol)即超文本传输协议,是基于 TCP/IP 的应用层协议,用于客户端(浏览器 / Postman)和服务器之间的通信,核心特点:

  • 无状态:协议本身不记录通信状态(需 Cookie/Session 补充);
  • 无连接:HTTP1.1 前每次请求都要建立新 TCP 连接(1.1 引入长连接);
  • 明文传输:数据直接传输,HTTPS 则是加密版 HTTP。

简单来说:你(客户端)通过 HTTP 告诉服务器 "要什么",服务器通过 HTTP 告诉你 "给什么 / 不给什么"

三、HTTP 请求:客户端到底发了什么?

当你在浏览器输入网址、点击按钮,或用 Postman 调用接口时,客户端会向服务器发送一个 HTTP 请求,完整的请求结构包含 3 部分:

1. 请求行(核心)

格式:请求方法 URL 协议版本示例:GET /user/1 HTTP/1.1

  • 请求方法 :最常用的 2 种(必须掌握):
    • GET:从服务器 "获取" 数据,参数拼在 URL 后(如/user?id=1),传输数据量小、不安全;
    • POST:向服务器 "提交" 数据(如登录、提交表单),参数放在请求体中,传输数据量大、更安全。其他方法(PUT/DELETE/PATCH)后续进阶篇再讲。
  • URL:要访问的服务器资源路径;
  • 协议版本:主流是 HTTP/1.1,HTTP/2 性能更优。

2. 请求头(关键)

请求头是键值对形式,用于告诉服务器 "额外信息",比如客户端类型、请求数据格式、认证信息等。

高频请求头(必记)

请求头 作用举例
Host 目标服务器域名(如www.baidu.com
Content-Type 请求体的数据格式(核心!)
User-Agent 客户端类型(如浏览器 / Postman/Java 程序)
Authorization 认证信息(如 Token、Basic Auth)
Cookie 客户端存储的会话信息

其中Content-Type是后端开发中最常接触的:

  • application/json:请求体是 JSON 格式(SpringBoot 接口最常用);
  • application/x-www-form-urlencoded:表单提交默认格式;
  • multipart/form-data:文件上传专用格式。

3. 请求体(可选)

只有 POST/PUT 等方法会有请求体,用于存放要提交的数据(如 JSON、表单数据、文件)。示例(JSON 格式):

json

复制代码
{
  "username": "java_diary",
  "password": "123456"
}

Java 实战:模拟 HTTP 请求(基于 HttpClient)

java

运行

java 复制代码
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientDemo {
    public static void main(String[] args) throws Exception {
        // 1. 创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        
        // 2. 构建POST请求
        HttpPost post = new HttpPost("http://localhost:8080/user/login");
        
        // 3. 设置请求头(核心:指定JSON格式)
        post.setHeader("Content-Type", "application/json");
        post.setHeader("User-Agent", "Java-HttpClient");
        
        // 4. 设置请求体
        String jsonBody = "{\"username\":\"java_diary\",\"password\":\"123456\"}";
        post.setEntity(new StringEntity(jsonBody, "UTF-8"));
        
        // 5. 发送请求并获取响应
        String response = EntityUtils.toString(httpClient.execute(post).getEntity());
        System.out.println("响应结果:" + response);
        
        // 6. 关闭客户端
        httpClient.close();
    }
}

依赖(Maven):

xml

XML 复制代码
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.14</version>
</dependency>

四、HTTP 响应:服务器到底返回了什么?

服务器接收到请求后,会返回一个 HTTP 响应,结构和请求对应,也包含 3 部分:

1. 状态行(核心)

格式:协议版本 状态码 状态描述示例:HTTP/1.1 200 OK

状态码是核心,按首位数字分为 5 类(必记):

类别 首位数字 含义 高频示例
成功 2xx 请求处理成功 200(成功)、201(创建成功)
重定向 3xx 需要进一步操作 301(永久重定向)、302(临时重定向)
客户端错误 4xx 客户端请求有问题 400(参数错误)、401(未认证)、403(无权限)、404(资源不存在)
服务器错误 5xx 服务器处理失败 500(服务器内部错误)、503(服务不可用)

2. 响应头

服务器返回的额外信息,比如数据格式、响应时间、Cookie 等。高频响应头:

  • Content-Type:响应体的数据格式(如application/json;charset=UTF-8);
  • Set-Cookie:服务器向客户端设置 Cookie;
  • Content-Length:响应体的字节长度。

3. 响应体(核心)

服务器返回的实际数据,比如 JSON、HTML、图片等。示例(JSON 格式):

json

复制代码
{
  "code": 200,
  "msg": "登录成功",
  "data": {
    "userId": 1001,
    "username": "java_diary"
  }
}

五、避坑指南:新手常踩的 HTTP 协议坑

  1. GET 请求传参过大:GET 参数拼在 URL 后,浏览器 / 服务器对 URL 长度有限制(一般 2KB),大参数请用 POST;
  2. Content-Type 不匹配 :前端传 JSON 但 Content-Type 写了form,后端@RequestBody会解析失败;
  3. 状态码乱用:比如明明是客户端参数错误,却返回 500(应返回 400),不利于排查问题;
  4. 忽略编码问题 :请求 / 响应未指定UTF-8,导致中文乱码(需在请求头 / 响应头指定 charset)。

六、今日实战小任务

  1. 用 Postman 发送 GET 请求:http://httpbin.org/get,查看请求行、请求头、响应体;
  2. 用 Postman 发送 POST 请求,Body 选 JSON 格式,提交{"name":"Java日记"},查看响应状态码;
  3. 基于 SpringBoot 写一个简单接口,返回不同状态码(如 200、404、500),用 Postman 调用验证。

总结

  1. HTTP 协议是 Java Web 开发的基础,核心是客户端请求 - 服务器响应的交互模型,请求 / 响应均包含 "行 + 头 + 体" 三部分;
  2. Content-Type是前后端交互的关键请求头 / 响应头,需匹配数据格式;
  3. HTTP 状态码按首位数字分类,2xx 成功、4xx 客户端错、5xx 服务器错,是排查接口问题的核心依据。

下一篇【Day32】预告:Java Web 入门之 Tomcat 服务器(安装、配置、部署项目),关注专栏不迷路~如果本文对你有帮助,欢迎点赞 + 收藏 + 关注,你的支持是我持续更新的动力💪!

相关推荐
wenzhangli71 小时前
OoderAgent SDK(0.6.6) UDP通讯与协议测试深度解析
网络·网络协议·udp
华玥作者1 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_1 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠2 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
lang201509282 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC3 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务3 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整3 小时前
面试点(网络层面)
前端·网络
VT.馒头4 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy4 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js