目錄
- 前置準備
- 步驟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版本實現完整的集成流程。
前置準備
- 有效的DeepSeek API密鑰(密鑰注冊地址)
- JDK 11或更高版本
- Maven 3.6.3
- 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
}
常見問題排查
-
401 Unauthorized
- 檢查API密鑰有效性
- 驗證Authorization頭部格式
-
序列化錯誤
- 確認DTO字段命名與API文檔一致
- 檢查Jackson注解配置
-
超時問題
- 調整連接超時設置
- 檢查網絡防火墻配置
-
速率限制
- 實現令牌桶限流算法
- 監控X-RateLimit-*響應頭
-
402 Payment Required 錯誤
- API賬戶余額耗盡
- API密鑰未綁定有效支付方式
- 請求參數觸發了計費規則
- ?模型調用超出免費額度