好的,下面我将演示:Java 使用 HttpClient
(JDK11+ 自带)调用 DeepSeek API(兼容 OpenAI 协议)并实现流式响应解析。
✅ 目标
你将实现:
- 使用 Java
HttpClient
发送请求到 DeepSeek 的 Chat 接口; - 设置
stream=true
实现 SSE(Server Sent Events)流式返回; - 实时接收
data: {...}
格式的每一段 JSON 片段; - 逐条解析、拼接最终结果。
✅ DeepSeek Chat 接口说明(兼容 OpenAI)
请求地址示例(假设 DeepSeek 提供的是 OpenAI 风格):
POST https://api.deepseek.com/v1/chat/completions
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
请求 JSON:
{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "讲一个笑话"}],
"temperature": 0.7,
"stream": true
}
✅ Java 示例代码:HttpClient + DeepSeek + 流式输出
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class DeepSeekStreamDemo {
public static void main(String[] args) throws Exception {
String apiKey = "YOUR_API_KEY";
String requestBody = """
{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "讲一个笑话"}],
"stream": true
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.deepseek.com/v1/chat/completions"))
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpClient client = HttpClient.newHttpClient();
CompletableFuture<Void> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
.thenAccept(response -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(response.body()))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("data: ")) {
String json = line.substring(6).trim();
if ("[DONE]".equals(json)) {
System.out.println("\n--- 结束 ---");
break;
}
String content = extractContent(json);
System.out.print(content);
}
}
} catch (Exception e) {
e.printStackTrace();
}
});
future.join(); // 等待完成
}
// 提取 content 字段内容
private static String extractContent(String jsonLine) {
try {
// 简单 JSON 提取,也可用 Jackson 或 Gson 更安全
int idx = jsonLine.indexOf("\"content\":\"");
if (idx != -1) {
int start = idx + 11;
int end = jsonLine.indexOf("\"", start);
if (end > start) {
return jsonLine.substring(start, end)
.replace("\\n", "\n")
.replace("\\\"", "\"");
}
}
} catch (Exception ignored) {}
return "";
}
}
✅ 示例输出
你听过“程序员的狗”吗?
他不会叫,只会:
System.out.println("汪!");
--- 结束 ---
✅ 提示
- 如需使用 JSON 解析推荐使用 Jackson、Gson、Fastjson,不建议手工
substring
; - DeepSeek 模型名可能是
deepseek-chat
或deepseek-coder
(具体以官方为准); - 若使用代理(国内用户常用),可配置
HttpClient
的代理参数; - 对接多个 LLM(如 DeepSeek、OpenAI、Moonshot)可以统一封装此流式调用逻辑。
发表回复