|
@@ -0,0 +1,88 @@
|
|
|
|
|
+# JDK HTTP Client 使用教程
|
|
|
|
|
+
|
|
|
|
|
+基于 JDK 自带模块 `java.net.http`(Java 11+,本仓库使用 Java 17)的实战示例项目,
|
|
|
|
|
+围绕一个本地运行的 User Management API,演示 JDK HTTP Client 的核心用法。
|
|
|
|
|
+每个知识点均包含:示例代码、JUnit 测试、文字说明。
|
|
|
|
|
+
|
|
|
|
|
+## 项目结构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+httpClient/
|
|
|
|
|
+├── src/ # JDK HTTP Client 示例与测试(根模块,Java 17)
|
|
|
|
|
+│ ├── main/java/space/anyi/httpClient/
|
|
|
|
|
+│ │ ├── model/ # UserRequest / UserVO / FileVO / Result<T> 模型
|
|
|
|
|
+│ │ ├── QuickStart.java # 快速入门:请求构造与响应处理
|
|
|
|
|
+│ │ ├── GetExample.java # GET 请求
|
|
|
|
|
+│ │ ├── PostExample.java # POST 请求(JSON)
|
|
|
|
|
+│ │ ├── PutDeleteExample.java # PUT / DELETE 请求
|
|
|
|
|
+│ │ ├── HeaderExample.java # 请求头
|
|
|
|
|
+│ │ ├── BodyExample.java # 请求体 / multipart 文件上传
|
|
|
|
|
+│ │ ├── FileDownloadExample.java # 文件下载
|
|
|
|
|
+│ │ ├── SyncAsyncExample.java # 同步与异步
|
|
|
|
|
+│ │ ├── ResponseHandlerExample.java # 响应处理器
|
|
|
|
|
+│ │ ├── ClientConfigExample.java # HTTP Client 配置
|
|
|
|
|
+│ │ ├── RequestConfigExample.java # HTTP Request 配置
|
|
|
|
|
+│ │ └── CoreApiExample.java # 核心对象 API 一览
|
|
|
|
|
+│ └── test/java/space/anyi/httpClient/ # 12 个测试类(JUnit 5)
|
|
|
|
|
+├── API_server/ # User Management API(Spring Boot 3.5,独立模块)
|
|
|
|
|
+├── httpClient.md # 主题大纲
|
|
|
|
|
+├── doc.md # 详细使用文档
|
|
|
|
|
+└── blog.md # 教程 blog(doc.md 的 blog 化渲染)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 环境要求
|
|
|
|
|
+
|
|
|
|
|
+- JDK 17+
|
|
|
|
|
+- Maven 3.6+
|
|
|
|
|
+
|
|
|
|
|
+## 快速开始
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 1. 启动 API 服务(独立 Spring Boot 应用,监听 8080 端口)
|
|
|
|
|
+mvn -f API_server/pom.xml spring-boot:run
|
|
|
|
|
+
|
|
|
|
|
+# 2. 运行全部测试(需先启动 API 服务)
|
|
|
|
|
+mvn test
|
|
|
|
|
+
|
|
|
|
|
+# 2'. 运行单个测试类
|
|
|
|
|
+mvn -Dtest=GetExampleTest test
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 注意:测试会真实调用本地 API,**必须**先启动 API 服务,否则网络相关测试会失败。
|
|
|
|
|
+
|
|
|
|
|
+## API 端点
|
|
|
|
|
+
|
|
|
|
|
+| 方法 | 路径 | 说明 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| GET | `/api/users` | 查询用户列表 |
|
|
|
|
|
+| GET | `/api/users/{id}` | 按 id 查询单个用户 |
|
|
|
|
|
+| POST | `/api/users` | 创建用户(JSON) |
|
|
|
|
|
+| PUT | `/api/users/{id}` | 整体更新用户(JSON) |
|
|
|
|
|
+| DELETE | `/api/users/{id}` | 删除用户 |
|
|
|
|
|
+| POST | `/api/files/upload` | 文件上传(multipart/form-data) |
|
|
|
|
|
+| GET | `/api/files/download/{storedFileName}` | 按存储文件名下载文件 |
|
|
|
|
|
+
|
|
|
|
|
+用户字段(`UserRequest`):`name`、`account`、`sex` 均必填,`account` 唯一,
|
|
|
|
|
+重复创建返回 409。所有接口返回统一包装结构 `{code, message, data}`。
|
|
|
|
|
+文件上传结果存于 `uploads/` 目录(已 gitignore)。
|
|
|
|
|
+
|
|
|
|
|
+启动后可通过 Swagger UI(springdoc)浏览接口文档:
|
|
|
|
|
+`http://localhost:8080/swagger-ui.html`
|
|
|
|
|
+
|
|
|
|
|
+## 文档
|
|
|
|
|
+
|
|
|
|
|
+| 文件 | 内容 |
|
|
|
|
|
+|------|------|
|
|
|
|
|
+| `httpClient.md` | 主题大纲(文档结构的事实来源) |
|
|
|
|
|
+| `doc.md` | 详细使用文档 |
|
|
|
|
|
+| `blog.md` | blog 版教程 |
|
|
|
|
|
+
|
|
|
|
|
+## 涉及知识点
|
|
|
|
|
+
|
|
|
|
|
+- GET / POST / PUT / DELETE 请求
|
|
|
|
|
+- 请求头与请求体(JSON、输入流、multipart 文件上传)
|
|
|
|
|
+- 文件上传与下载
|
|
|
|
|
+- 同步 `send()` 与异步 `sendAsync()`、批量并发
|
|
|
|
|
+- 内置与自定义响应处理器(BodyHandler / BodySubscriber)
|
|
|
|
|
+- HTTP Client 与 HTTP Request 配置项
|
|
|
|
|
+- 核心对象(HttpClient / HttpRequest / HttpResponse / HttpHeaders)API
|