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.pswp.cn/pingmian/72032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72032.shtml
英文地址,請注明出處:http://en.pswp.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;就可能會出現一些不能正確處理的情…