好的,下面我将演示: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)可以统一封装此流式调用逻辑。