Parcourir la source

基线:初始化教程项目,引入 Jackson 依赖与快速入门示例

yangyi il y a 1 semaine
Parent
commit
451971c322

+ 21 - 0
AGENTS.md

@@ -0,0 +1,21 @@
+# AGENTS.md
+
+## Project
+
+Single-module Maven project (Java 17) for exploring `java.net.http.HttpClient`.
+Entry point: `src/main/java/space/anyi/httpClient/Main.java`
+
+## Build & Run
+
+```bash
+mvn compile exec:java          # compile and run Main.main()
+mvn package -q                 # package (no tests yet)
+```
+
+No test framework is configured; `src/test/` is empty.
+
+## Conventions
+
+- Package: `space.anyi.httpClient`
+- Language: Java 17 (`maven.compiler.source/target` = 17)
+- Documentation notes live in `httpClient.md`

+ 60 - 0
doc.md

@@ -0,0 +1,60 @@
+# JDK HTTP Client 使用教程
+
+本文档基于 JDK 自带模块 `java.net.http`(Java 11+,本项目使用 Java 17)编写,
+围绕本机运行的 **User Management API**(`http://localhost:8080`)进行实战演示。
+每个知识点均包含:示例代码、JUnit 测试、文字说明。
+
+> 运行示例/测试前,请确保 API 服务已在本机 8080 端口启动。
+
+---
+
+## 一、快速入门:请求的构造 与 响应处理
+
+### 1.1 文字说明
+
+HTTP Client 的基本使用流程只有一步:**构造请求并发送**。核心 API 有三个:
+
+| 类 | 职责 |
+|----|------|
+| `java.net.http.HttpClient` | HTTP 客户端,负责发送请求、管理连接 |
+| `java.net.http.HttpRequest` | 请求对象,描述 URI、方法、请求头、请求体 |
+| `java.net.http.HttpResponse<T>` | 响应对象,携带状态码、响应头和响应体 |
+
+最小化流程分四步:
+
+1. **创建客户端**:`HttpClient.newHttpClient()` 用 JDK 默认配置创建实例;
+2. **构造请求**:`HttpRequest.newBuilder().uri(...).GET().build()` 链式构建;
+3. **发送请求**:`client.send(request, BodyHandlers.ofString())` 同步阻塞发送;
+4. **处理响应**:通过 `HttpResponse` 获取 `statusCode()`、`body()` 等。
+
+> 注意:`send()` 会抛出 `IOException`(IO 失败)和 `InterruptedException`(线程被中断),
+> 需要显式处理或向上抛出。
+
+### 1.2 示例代码
+
+见 `QuickStart.java`,核心代码如下:
+
+```java
+// 1. 创建 HttpClient:newHttpClient() 使用 JDK 默认的配置创建一个客户端
+HttpClient httpClient = HttpClient.newHttpClient();
+
+// 2. 构造请求:HttpRequest.newBuilder() 返回一个 Builder,链式配置请求
+HttpRequest request = HttpRequest.newBuilder()
+        .uri(URI.create(BASE_URL + "/api/users"))  // 设置请求的目标地址
+        .GET()                                     // 指定请求方法为 GET
+        .build();                                  // 结束构建,返回不可变对象
+
+// 3. 发送请求:send() 同步阻塞,BodyHandlers.ofString() 将响应体转为字符串
+HttpResponse<String> response =
+        httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+// 4. 处理响应
+System.out.println("HTTP 状态码: " + response.statusCode());
+System.out.println("响应体: " + response.body());
+```
+
+### 1.3 测试代码
+
+见 `QuickStartTest.java`。测试会真实调用本地 API,运行后控制台打印响应结果。
+(测试目标:GET `http://localhost:8080/api/users`,正常情况下返回
+`{"code":200,"message":"OK","data":[...]}`)

+ 17 - 3
httpClient.md

@@ -1,7 +1,21 @@
-# JDK HTTPClient
+# JDK HTTP Client
+## 快速入门
+- 请求的构造
+- 响应处理
 1. GET
 2. POST
+   - POST请求(form/json/file)
+   - PUT请求
+   - DELETE请求
 3. 请求头
+   - 在Http Client配置请求头
+   - 在HTTP Request配置请求头
 4. 请求体
-5. 同步
-6. 异步
+5. 文件上传
+6. 同步
+7. 异步
+8. 响应处理器
+   - JDK提供的响应处理器
+   - 自定义响应处理器
+9. HTTP Client配置项
+10. HTTP Request配置项

+ 16 - 0
pom.xml

@@ -14,4 +14,20 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
+    <dependencies>
+        <!-- Jackson 用于 JSON 序列化与反序列化 -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.15.2</version>
+        </dependency>
+        <!-- JUnit5 测试框架 -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>5.8.2</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
 </project>

+ 21 - 0
src/main/java/space/anyi/httpClient/GetExample.java

@@ -0,0 +1,21 @@
+package space.anyi.httpClient;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+
+public class GetExample {
+    public void process() throws IOException, InterruptedException {
+        HttpClient httpClient = HttpClient.newHttpClient();
+        HttpRequest httpRequest = HttpRequest.newBuilder()
+                //设置请求的URL
+                .uri(URI.create("http://www.baidu.com"))
+                //设置请求方法为GET
+                .GET()
+                //设置请求头
+                .header("Content-Type", "application/json")
+                .build();
+
+    }
+}

+ 0 - 7
src/main/java/space/anyi/httpClient/Main.java

@@ -1,7 +0,0 @@
-package space.anyi.httpClient;
-
-public class Main {
-    public static void main(String[] args) {
-        System.out.println("Hello world!");
-    }
-}

+ 60 - 0
src/main/java/space/anyi/httpClient/QuickStart.java

@@ -0,0 +1,60 @@
+package space.anyi.httpClient;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+/**
+ * 快速入门:请求的构造 与 响应处理
+ *
+ * <p>使用 JDK 自带的 java.net.http.HttpClient 发送一个 HTTP GET 请求,
+ * 体验一次最基础的「构造请求 -> 发送请求 -> 处理响应」的完整流程。</p>
+ *
+ * <p>请求目标为本机提供的 User Management API 的查询用户列表接口:
+ * GET http://localhost:8080/api/users</p>
+ */
+public class QuickStart {
+
+    /** 服务基地址常量,所有示例都指向本机 API 服务 */
+    private static final String BASE_URL = "http://localhost:8080";
+
+    /**
+     * 构造一个 GET 请求并发送,随后打印响应体内容。
+     *
+     * <p>整个过程可以拆分为四步:
+     * <ol>
+     *     <li>创建 HttpClient 客户端实例</li>
+     *     <li>通过 HttpRequest.Builder 构造请求</li>
+     *     <li>调用 send() 同步发送请求,并指定响应处理器</li>
+     *     <li>处理响应结果</li>
+     * </ol>
+     * </p>
+     */
+    public void process() throws IOException, InterruptedException {
+        // 1. 创建 HttpClient:newHttpClient() 使用 JDK 默认的配置创建一个客户端
+        HttpClient httpClient = HttpClient.newHttpClient();
+
+        // 2. 构造请求:HttpRequest.newBuilder() 返回一个 Builder,
+        //    通过链式调用逐步配置请求的 URI、方法、请求头等信息
+        HttpRequest request = HttpRequest.newBuilder()
+                // 设置请求的目标地址
+                .uri(URI.create(BASE_URL + "/api/users"))
+                // 指定请求方法为 GET(不调用则默认为 GET,但显式写出更清晰)
+                .GET()
+                // 结束构建,返回不可变的 HttpRequest 对象
+                .build();
+
+        // 3. 发送请求:
+        //    send() 是同步方法,会阻塞等待服务器的响应;
+        //    第二个参数是响应处理器 BodyHandler,这里使用 BodyHandlers.ofString()
+        //    直接将响应体转为字符串
+        HttpResponse<String> response =
+                httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+        // 4. 处理响应:通过 statusCode() 获取状态码,body() 获取响应体字符串
+        System.out.println("HTTP 状态码: " + response.statusCode());
+        System.out.println("响应体: " + response.body());
+    }
+}

+ 24 - 0
src/test/java/space/anyi/httpClient/QuickStartTest.java

@@ -0,0 +1,24 @@
+package space.anyi.httpClient;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * 快速入门示例的测试类
+ *
+ * <p>测试依赖本地运行的 User Management API 服务(http://localhost:8080),
+ * 因此运行测试前需要先启动服务。</p>
+ */
+class QuickStartTest {
+
+    @Test
+    void process() throws IOException, InterruptedException {
+        QuickStart quickStart = new QuickStart();
+
+        // 实际发送请求并打印响应结果
+        quickStart.process();
+    }
+}