JNet v3.0.0 是一个基于JDK11原生HTTP Client的极简HTTP客户端库,专为现代化Java开发设计。
- 🚀 零第三方依赖 - 仅依赖JDK11+
- ⚡ 支持HTTP/2 - 原生支持现代协议
- 📱 多平台兼容 - Windows/Linux/Mac/Android
- 🎯 requests风格API - 极简、优雅
- 🔄 异步友好 - CompletableFuture原生支持
- 📦 极简代码 - 仅1个文件,450行代码
- 🌊 SSE支持 - Server-Sent Events流式处理
- JDK 11+
- 无需额外依赖
// GET请求 - 一行代码搞定!
String data = JNet.get("https://httpbin.org/get");// GET请求 - 带查询参数
Map<String, String> params = new HashMap<>();
params.put("name", "Alice");
params.put("age", "30");
String data = JNet.get("https://httpbin.org/get", params);
// POST请求 - 带请求头
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer token123");
headers.put("Content-Type", "application/json");
String result = JNet.post("https://httpbin.org/post", "data", headers);
// POST JSON - 最简单方式
Map<String, Object> json = new HashMap<>();
json.put("name", "Alice");
json.put("email", "alice@example.com");
String result = JNet.postJson("https://httpbin.org/post", json);
// 异步请求 - 非阻塞
CompletableFuture<String> future = JNet.getAsync("https://httpbin.org/get");
future.thenAccept(data -> System.out.println(data));// 带参数(函数式风格)
String data = JNet.get("https://httpbin.org/get",
JNet.params("name", "Alice", "age", "30"));
// 带认证(函数式风格)
String data = JNet.get("https://httpbin.org/get",
JNet.bearerToken("your-token-here"));| 方法 | 描述 | 示例 |
|---|---|---|
get(url) |
GET请求 | JNet.get(url) |
get(url, params) |
GET请求(带参数) | JNet.get(url, params) |
get(url, headers, params) |
GET请求(完整参数) | JNet.get(url, headers, params) |
post(url, body) |
POST请求 | JNet.post(url, body) |
post(url, body, headers) |
POST请求(带头部) | JNet.post(url, body, headers) |
put(url, body) |
PUT请求 | JNet.put(url, body) |
patch(url, body) |
PATCH请求 | JNet.patch(url, body) |
delete(url) |
DELETE请求 | JNet.delete(url) |
head(url) |
HEAD请求 | JNet.head(url) |
request(method, url, body) |
通用请求 | JNet.request("PATCH", url, body) |
| 方法 | 描述 | 示例 |
|---|---|---|
getAsync(url) |
异步GET | JNet.getAsync(url) |
postAsync(url, body) |
异步POST | JNet.postAsync(url, body) |
postJsonAsync(url, json) |
异步POST JSON | JNet.postJsonAsync(url, json) |
requestAsync(method, url, body) |
异步通用请求 | JNet.requestAsync("POST", url, body) |
// 创建JSON数据
Map<String, Object> json = new HashMap<>();
json.put("name", "JNet");
json.put("version", "3.0.0");
json.put("features", new String[]{"HTTP/2", "Zero-Dependency", "Simple"});
// 发送JSON请求
String result = JNet.postJson("https://httpbin.org/post", json);// Basic Auth
String auth = JNet.basicAuth("username", "password");
String data = JNet.get("https://httpbin.org/basic-auth/user/pass", auth);
// Bearer Token
String token = JNet.bearerToken("your-token-here");
String data = JNet.get("https://api.example.com/data", token);// 构建查询参数
Map<String, String> params = JNet.params("key1", "value1", "key2", "value2");
// 构建请求头
Map<String, String> headers = JNet.headers("Content-Type", "application/json");
// 创建JSON对象
Map<String, Object> json = JNet.json();
json.put("name", "Alice");| 特性 | JNet v3.0 | OkHttp | Apache HttpClient |
|---|---|---|---|
| 第三方依赖 | ❌ 无 | ✅ 1个 | ✅ 多个 |
| HTTP/2支持 | ✅ 原生 | ✅ 支持 | ✅ 支持 |
| 代码量 | 450行 | 20000+行 | 15000+行 |
| 学习成本 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| SSE支持 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
// 其他库需要这样写
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com")
.build();
Response response = client.newCall(request).execute();
// JNet v3.0 只需要一行
String data = JNet.get("https://api.example.com");- 不需要引入任何第三方库
- 仅依赖JDK11+原生API
- 避免依赖冲突和版本问题
- 原生支持HTTP/2
- 头部压缩
- 连接复用
- 多路复用
- Server-Sent Events (SSE)
- Java 11+ (所有平台)
- Android 11+ (API 30+)
- 鸿蒙系统
<dependency>
<groupId>com.github.netcapture</groupId>
<artifactId>Jnt</artifactId>
<version>3.0.0</version>
</dependency>implementation 'com.github.netcapture:Jnt:3.0.0'只需要下载 JNet.java 文件,放入你的项目即可!
graph TB
A[应用程序层] -->|调用| B[JNet.java 核心API]
B -->|使用| C[HttpClient JDK11原生]
C -->|网络通信| D[HTTP Server]
subgraph "JNet.java 特性"
B1[静态方法: get/post/put/delete]
B2[异步支持: CompletableFuture]
B3[工具方法: params/headers/json/auth]
B4[零依赖: 仅JDK11+]
end
B --> B1
B --> B2
B --> B3
B --> B4
subgraph "HttpClient 特性"
C1[HTTP/2 支持]
C2[连接复用]
C3[头部压缩]
C4[异步IO]
end
C --> C1
C --> C2
C --> C3
C --> C4
graph TD
A[com.jnet.core] --> B[JNet.java]
A --> C[Response.java]
A --> D[Request.java 旧版]
A --> E[JNetClient.java 旧版]
A --> F[Call.java 旧版]
A --> G[SSEClient.java]
A --> H[GithubHelper]
A --> I[GiteeHelper]
A --> J[JNetUtils]
A --> K[FileUtils]
A --> L[Pair]
A --> M[兼容层]
M --> N[Jnt.java]
M --> O[NJnt.java]
classDef mainAPI fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef tools fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
class B mainAPI
class J,K,L tools
sequenceDiagram
participant U as 用户
participant J as JNet
participant B as buildUrl
participant R as HttpRequest.Builder
participant C as HttpClient
participant N as 网络
participant S as 服务器
U->>J: JNet.get(url, params, headers)
J->>B: 构建带参数的URL
B-->>J: 返回完整URL
J->>R: 创建请求构建器
R->>R: 设置方法/URL/Headers
J->>C: 发送请求
C->>N: 网络通信
N->>S: HTTP/HTTP2请求
S-->>N: HTTP响应
N-->>C: 响应数据
C-->>J: HttpResponse
J->>J: 处理响应体
J-->>U: 返回 String body
flowchart TD
A[异步请求开始] --> B[JNet.getAsync]
B --> C[返回CompletableFuture]
C --> D[HttpClient.sendAsync]
D --> E{等待响应}
E -->|非阻塞| F[线程可执行其他任务]
F --> G[响应完成]
G --> H[future.complete]
H --> I[回调处理]
subgraph "异步特性"
J[非阻塞IO]
K[CompletableFuture]
L[thenApply/thenAccept]
end
D --> J
C --> K
I --> L
请求数: 1000
并发数: 50
内存占用:
JNet v3.0: 5-8MB
OkHttp: 15-20MB
响应时间:
JNet v3.0: 平均238ms
OkHttp: 平均245ms
结论: 性能相当,内存占用更少
✅ 推荐
- REST API调用
- 微服务通信
- Webhook集成
- 数据采集
- 爬虫开发
- 移动端应用 (Android)
- SSE流式处理
- HTTP/2优化场景
❌ 不推荐
- 需要连接池管理
- 需要复杂拦截器
- 需要响应缓存
- JDK8环境
- 需要JDK11或更高版本
- Android需要API 30+ (Android 11)
- 无连接池 (为简化设计)
- 无拦截器 (为简化设计)
- 无响应缓存 (可自行实现)
- v3.1: 代理支持
- v3.1: 文件上传
- v3.2: 连接池支持
- v3.5: WebSocket支持
- v4.0: 响应缓存
# 编译
javac -d target/classes src/main/java/com/jnet/core/JNet.java
# 运行测试
./test.sh minimal
# 构建JAR
./build.sh package./build.sh package # 构建JAR
./build.sh test # 运行测试
./build.sh release # 发布版本./test.sh all # 运行全部测试
./test.sh minimal # JNet专用测试
./test.sh concurrent # 并发性能测试
./test.sh sse # SSE流式测试
./test.sh report # 生成HTML报告让HTTP请求变得像Python requests一样简单!
我们相信:
- 简单就是美
- 少即是多
- 最好的代码是不需要文档的代码
MIT License - 详见 LICENSE 文件
sanbo - sanbo.xyz@gmail.com
感谢以下项目的设计灵感:
- Python requests
- JDK HTTP Client
- OKHttp
- Apache HttpClient
// 只需一行代码!
String data = JNet.get("https://httpbin.org/get");
System.out.println(data);让HTTP请求变得简单! 🚀
⭐ 如果这个项目对你有帮助,请给个Star支持一下!