Spring Boot 调用DeepSeek API的详细教程

目录

    • 前置准备
    • 步骤1:创建Spring Boot项目
    • 步骤2:配置API参数
    • 步骤3:创建请求/响应DTO
    • 步骤4:实现API客户端
    • 步骤5:创建控制器
    • 步骤6:异常处理
    • 步骤7:测试验证
      • 单元测试示例
      • Postman测试请求
    • 常见问题排查

本文将通过具体示例演示如何通过Spring Boot 2.7.2框架调用DeepSeek的API服务。我们将使用Java 11和最新的Spring Boot 2.7.2版本实现完整的集成流程。

前置准备

  1. 有效的DeepSeek API密钥(密钥注册地址)
  2. JDK 11或更高版本
  3. Maven 3.6.3
  4. Postman(用于API测试验证)
    详细可见官方DeepSeek API文档

步骤1:创建Spring Boot项目

通过Spring Initializr创建项目:

  • Project: Maven
  • Language: Java
  • Packaging: Jar
  • Java Version: 11
  • Dependencies:
    • Spring Web
    • Lombok
    • Jackson Databind
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.3</version> <!-- 可替换为最新版本 --></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope>
</dependency>

步骤2:配置API参数

application.yml中添加配置:

deepseek:api:base-url: https://api.deepseek.com/v1chat-endpoint: /v1/chat/completionsapi-key: your_api_key_here

步骤3:创建请求/响应DTO

// 请求体
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ChatRequest {private String model;private List<Message> messages;private double temperature;@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic static class Message {private String role;private String content;}
}// 响应体
@Data
public class ChatResponse {private String id;private String object;private long created;private List<Choice> choices;@Datapublic static class Choice {private Message message;private int index;private String finish_reason;@Datapublic static class Message {private String role;private String content;}}
}

步骤4:实现API客户端

package com.tianwen.service.impl;import com.tianwen.deepseekDTO.ChatRequest;
import com.tianwen.deepseekDTO.ChatResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.WebClient;import javax.annotation.PostConstruct;@Service
public class DeepSeekLegacyClient {@Value("${deepseek.api.api-key}")private String apiKey;@Value("${deepseek.api.base-url}")private String baseUrl;private RestTemplate restTemplate;@Autowiredprivate RestTemplateBuilder builder;@PostConstruct  // 确保依赖注入完成后执行public void init() {this.restTemplate = builder.rootUri(baseUrl).defaultHeader("Authorization", "Bearer " + apiKey).build();}public DeepSeekLegacyClient(RestTemplateBuilder builder) {this.restTemplate = builder.rootUri(baseUrl).defaultHeader("Authorization", "Bearer " + apiKey).build();}public ChatResponse chatCompletion(ChatRequest request) {String fullUrl = baseUrl + "/chat/completions";  // 手动拼接完整路径HttpEntity<ChatRequest> entity = new HttpEntity<>(request);ResponseEntity<ChatResponse> response = restTemplate.postForEntity(fullUrl,entity,ChatResponse.class);return response.getBody();}
}@Configuration
public class WebClientConfig {@Value("${deepseek.api.base-url}")private String baseUrl;@Value("${deepseek.api.api-key}")private String apiKey;@Beanpublic WebClient webClient() {return WebClient.builder().baseUrl(baseUrl).defaultHeader("Authorization", "Bearer " + apiKey).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();}
}

步骤5:创建控制器

@RestController
@RequestMapping("/api/chat")
@RequiredArgsConstructor
public class ChatController {private final DeepSeekClient deepSeekClient;@PostMappingpublic ResponseEntity<ChatResponse> chat(@RequestBody ChatRequest request) {return ResponseEntity.ok(deepSeekClient.chatCompletion(request));}
}

步骤6:异常处理

全局异常处理器:

@RestControllerAdvice
public class GlobalExceptionHandler {// 修改WebClient异常处理@ExceptionHandler(WebClientResponseException.class)public ResponseEntity<String> handleWebClientErrors(WebClientResponseException ex) {return ResponseEntity.status(ex.getRawStatusCode()).body("API Communication Error: " + ex.getResponseBodyAsString());}
}

步骤7:测试验证

单元测试示例

@SpringBootTest
class DeepSeekClientTest {@Autowiredprivate DeepSeekClient client;@Testvoid testChatCompletion() {ChatRequest request = ChatRequest.builder().model("deepseek-chat").temperature(0.7).messages(List.of(new ChatRequest.Message("user", "你好,介绍一下你自己"))).build();ChatResponse response = client.chatCompletion(request);assertNotNull(response);assertFalse(response.getChoices().isEmpty());}
}

Postman测试请求

POST http://localhost:8080/api/chat
Headers:
Content-Type: application/jsonBody:
{"messages": [{"content": "如何学习java编程?","role": "user"}],"model": "deepseek-chat","temperature": 0.7
}

常见问题排查

  1. 401 Unauthorized

    • 检查API密钥有效性
    • 验证Authorization头部格式
  2. 序列化错误

    • 确认DTO字段命名与API文档一致
    • 检查Jackson注解配置
  3. 超时问题

    • 调整连接超时设置
    • 检查网络防火墙配置
  4. 速率限制

    • 实现令牌桶限流算法
    • 监控X-RateLimit-*响应头
  5. 402 Payment Required 错误

    • API账户余额耗尽
    • API密钥未绑定有效支付方式
    • 请求参数触发了计费规则
    • ​模型调用超出免费额度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多维数据聚合方案:SQL GROUPING SETS深度解析

一、什么是GROUPING SETS&#xff1f; GROUPING SETS是SQL标准中的多维聚合运算符&#xff0c;允许在单个查询中实现多维度组合的分组统计。相较于传统UNION ALL方案&#xff0c;性能可提升3-10倍&#xff08;TPC-DS基准测试&#xff09;。 二、核心语法解析 SELECT column1,…

Excel中国式排名,3种方法!

大家好&#xff0c;我是小鱼。 什么是中国式排名呢&#xff1f; 举个例子比如说公司一共有10名员工进行成绩考核&#xff0c;如果9个人考核成绩都是90分&#xff0c;你是89分&#xff0c;按照国际惯用的排名法则&#xff1a;9 个人考核成绩并列第一&#xff0c;你第10名&…

哪些业务场景更适合用MongoDB?何时比MySQL/PostgreSQL好用?

哪些业务场景更适合用MongoDB&#xff1f;何时比MySQL/PostgreSQL好用&#xff1f; 就像淘宝的个性化推荐需要灵活调整商品标签&#xff0c;MongoDB这种"变形金刚"式的数据库&#xff0c;在处理以下三类中国特色业务场景时更具优势&#xff1a; 一、动态数据就像&q…

深度解读:OpenAI发布GPT-5的技术突破与商业影响

引言 2025年2月&#xff0c;OpenAI正式发布GPT-5&#xff0c;这一被誉为“AI新纪元开篇之作”的模型&#xff0c;不仅实现了技术架构的颠覆性创新&#xff0c;更以免费开放策略引发行业地震。本文将从技术突破、商业影响、行业竞争格局及未来挑战四个维度&#xff0c;全面解析…

网络防火墙是什么有什么用_网络防火墙:守护信息安全的重要屏障

网络防火墙的基本概念 网络防火墙是网络安全领域的重要组成部分&#xff0c;它充当着内部网络和外部网络之间的安全防护层。防火墙能够监控和控制进出网络的数据流&#xff0c;只允许符合安全策略的信息通过&#xff0c;从而有效阻止潜在威胁的入侵。简而言之&#xff0c;网络…

C# WPF 串口通信

C# WPF 串口通信 安装依赖库 安装依赖库 System.IO.Ports using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windo…

【玩转23种Java设计模式】结构型模式篇:组合模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…

如何选取合适的 NewRatio 值来优化 JVM 的垃圾回收策略

目录 一、垃圾回收模型简介 &#xff08;一&#xff09;新生代&#xff08;Young Generation&#xff09; &#xff08;二&#xff09;老年代&#xff08;Old Generation&#xff09; &#xff08;三&#xff09;NewRatio 的作用与影响 &#xff08;四&#xff09;图解&am…

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…

第十一届蓝桥杯单片机国赛

什么&#xff1f;4T模拟赛和省赛做起来轻轻松松&#xff1f;不妨来挑战一下第十一届国赛&#xff0c;这一届的国赛居然没考超声波、串口通信&#xff01;只要你正确地理解了题目的意思&#xff0c;规避出题人挖的坑&#xff0c;拿个国一轻轻松松。 附件&#xff1a;第十一届蓝桥…

大彩串口屏开发 —— MODBUS通信

目 录 Modbus通信方式 1 使用变量与协议设置方式 2 使用LUA脚本方式 3 两者结合 Modbus通信 大彩串口屏可以采用三种方式实现与其它设备进行modbus通信和逻辑处理。 方式 1 使用变量与协议设置 步骤1 在协议设置里进行设置&#xff0c;包括开启modbus协议&#xff0c;屏做为主…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件&#xff08;可能是配置的时候格式错误&#xff09;&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xf…

怎么实现: 大语言模型微调案例

怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…

Claude:AI领域的多面手,从语言模型到智能编码

文章目录 引言Claude的起源与发展1. Claude的诞生2. Claude 3.7 Sonnet的突破 版本迭代技术原理Claude的独特优势混合推理模式成本与性能的平衡开发者友好的工具 功能及应用Claude的未来展望结论 引言 Claude是由Anthropic公司开发的大型语言模型&#xff0c;在人工智能领域&a…

RocketMQ 详细教程(Spring Boot Spring Cloud Alibaba)

1. RocketMQ 简介 RocketMQ 是阿里巴巴开源的一款分布式消息队列&#xff0c;具有高吞吐量、低延迟、可靠性等特点&#xff0c;广泛应用于金融、电商、物联网等领域。 RocketMQ 的核心特性&#xff1a; 高可靠性&#xff1a;支持消息存储、重复消费、失败重试等高可用性&…

Spring(七)AOP-代理模式

目录 代理模式 一 静态代理 一、核心作用 二、使用场景 二 动态代理 一、核心作用 二、使用场景 具体实现&#xff1a;&#xff08;初始&#xff09; 具体实现&#xff1a;&#xff08;改进&#xff09; 一、核心业务逻辑 1. 接口 MathCalculator 2. 实现类 MathCa…

Java Lambda表达式:现代编程的简洁之道

引言 在Java 8中&#xff0c;Lambda表达式的引入标志着Java语言向函数式编程迈出了重要一步。Lambda不仅简化了代码结构&#xff0c;还提升了开发效率&#xff0c;使得Java能够更灵活地应对现代编程需求。本文将深入探讨Lambda表达式的核心概念、语法规则、应用场景及其对Java…

BGP分解实验·21——BGP选路原则之本地优先级

当使用BGP路径属性——本地优先级&#xff0c;进行路由优选时&#xff0c;优选“本地优先级”数值较大的那个。&#xff08;eBGP之间更新不携带这个属性&#xff09; 实验拓扑如下&#xff1a; 在未实现本地优先级策略前&#xff0c;先在各个BGP之间配置完成基本连接。 R1的基…

【redis】应用场景:共享会话和手机验证码

文章目录 共享会话实现思路 手机验证码实现思路伪代码实现生成验证码验证验证码 共享会话 实现思路 如果每个应用服务器&#xff0c;维护自己的会话数据&#xff0c;此时彼此之间胡共享&#xff0c;用户请求访问到不同的服务器上&#xff0c;就可能会出现一些不能正确处理的情…