共计 2815 个字符,预计需要花费 8 分钟才能阅读完成。
背景与痛点
在当前的 AI 浪潮中,快速集成 ChatGPT API 成为了提升开发效率的关键需求。然而,开发者在实际集成过程中常常会遇到以下痛点:
- API 认证流程复杂,需要处理 token 生成和刷新
- 响应结构嵌套深,解析困难
- 缺乏统一的异常处理机制
- 性能瓶颈难以预估
- 生产环境的安全隐患
技术选型
目前主流的集成方式有三种:
- 直接调用 OpenAI 官方 SDK
- 使用第三方封装库
- 原生 HTTP 请求
我们选择原生 HTTP 请求方案,因为:
- 避免 SDK 版本锁定
- 更灵活的参数控制
- 便于后续自定义扩展
核心实现
1. 依赖配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
2. API 认证配置
@Configuration
public class ChatGPTConfig {@Value("${openai.api.key}")
private String apiKey;
@Bean
public RestTemplate chatGPTRestTemplate() {RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add((request, body, execution) -> {request.getHeaders().add("Authorization", "Bearer" + apiKey);
return execution.execute(request, body);
});
return restTemplate;
}
}
3. 服务层封装
@Service
@RequiredArgsConstructor
public class ChatGPTService {
private final RestTemplate restTemplate;
private static final String API_URL = "https://api.openai.com/v1/chat/completions";
public String getChatResponse(String prompt) {HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Map<String, Object> request = new HashMap<>();
request.put("model", "gpt-3.5-turbo");
request.put("messages", List.of(Map.of("role", "user", "content", prompt)));
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(request, headers);
try {
ResponseEntity<String> response = restTemplate.postForEntity(API_URL, entity, String.class);
return parseResponse(response.getBody());
} catch (RestClientException e) {throw new ChatGPTException("API 调用失败", e);
}
}
private String parseResponse(String jsonResponse) {
// 使用 Jackson 或 Gson 解析 JSON
return jsonResponse; // 简化示例
}
}
4. 异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ChatGPTException.class)
public ResponseEntity<ErrorResponse> handleChatGPTException(ChatGPTException ex) {return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
.body(new ErrorResponse(ex.getMessage()));
}
}
完整代码示例
Controller 层
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/chat")
@Api(tags = "ChatGPT API 接口")
public class ChatGPTController {
private final ChatGPTService chatGPTService;
@PostMapping
@ApiOperation("获取 AI 回复")
public ResponseEntity<String> chat(@RequestBody String prompt) {return ResponseEntity.ok(chatGPTService.getChatResponse(prompt));
}
}
性能考量
- 请求限流 :实现 RateLimiter 控制 QPS
- 缓存策略 :对常见问题答案缓存 24 小时
- 异步处理 :使用 @Async 注解实现非阻塞调用
@Async
public CompletableFuture<String> getChatResponseAsync(String prompt) {return CompletableFuture.completedFuture(getChatResponse(prompt));
}
安全建议
- API 密钥通过 Vault 或 KMS 管理
- 用户输入进行 XSS 过滤
- AI 输出内容审核
避坑指南
- 429 错误 :添加指数退避重试机制
- 模型版本过时 :定期检查 API 文档
- 长响应超时 :合理设置 connectTimeout
总结与延伸
通过这套方案,我们实现了:
- 5 分钟快速集成
- 生产级异常处理
- 可扩展的架构设计
未来可扩展方向:
- 响应式编程改造
- 多模型支持
- 对话上下文管理
完整项目代码已上传 GitHub,欢迎 Star 和贡献。在实际使用中遇到任何问题,可以在评论区留言讨论。
正文完
发表至: 技术教程
2026年3月29日