从 0 到 1 搭建第一个 Spring AI 聊天接口
本章是 Spring AI 实战项目的第一步:我们将基于第 1 章搭建好的 Spring AI 项目,
实现一个真正可用的 HTTP 聊天接口,可以通过 curl 或 Postman 直接与 AI 对话。
ChatRequest / ChatResponse)ChatController,提供 /api/chat 聊天接口ChatModel,让接口真正调用大模型curl 测试接口,请求和响应都是 JSON
为了方便你在本地做前后端联调,本课程提供了一套简单的前端页面示例(基于原项目的 static 目录)。
你可以直接下载到本机,修改后用任何静态服务器或 IDE 打开调试。
当前章节完成后,你的项目结构(后端工程 + 前端静态页)大致如下:
spring-ai-tutorial-root/ # 本课程示例根目录
└── windsurf-project/ # Spring AI 后端示例工程
├── pom.xml
└── src/
├── main/
│ ├── java/com/example/chatbot/
│ │ ├── AiChatbotApplication.java
│ │ ├── controller/ChatController.java
│ │ └── dto/
│ │ ├── ChatRequest.java
│ │ └── ChatResponse.java
│ └── resources/
│ ├── application.yml
│ └── static/
│ ├── index.html
│ ├── app.js
│ ├── style.css
│ ├── demo.html
│ ├── demo-style.css
│ └── demo-script.js
└── test/
└── java/com/example/chatbot/knowledge/
└── Test01_SpringAIBasics.java
你可以把后端项目单独用 IDE 打开运行,然后通过 http://localhost:8080/index.html 访问前端页面。
如果你的后端接口不是示例中的路径,请在 app.js 中把 API 地址改成你的实际接口(例如 /api/chat)。
在开始之前,请确认你已经完成:
AiChatbotApplication 正常运行。application.yml 中已经配置了 spring.ai.dashscope.api-key。Spring AI 教学项目启动成功 的 ASCII 输出。我们先定义两个最基础的数据结构:ChatRequest(请求)和 ChatResponse(响应)。
路径:src/main/java/com/example/chatbot/dto/ChatRequest.java
package com.example.chatbot.dto;
/**
* 聊天请求 DTO
*/
public record ChatRequest(
/** 用户输入的消息 */
String message
) {
/** 简单的参数校验 */
public void validate() {
if (message == null || message.trim().isEmpty()) {
throw new IllegalArgumentException("消息不能为空");
}
}
}路径:src/main/java/com/example/chatbot/dto/ChatResponse.java
package com.example.chatbot.dto;
import java.time.LocalDateTime;
/**
* 聊天响应 DTO
*/
public record ChatResponse(
String message, // AI 回复内容
LocalDateTime timestamp, // 响应时间
boolean success, // 是否成功
String error // 错误信息(如果有)
) {
// 工厂方法:成功
public static ChatResponse success(String message) {
return new ChatResponse(message, LocalDateTime.now(), true, null);
}
// 工厂方法:失败
public static ChatResponse error(String errorMessage) {
return new ChatResponse(null, LocalDateTime.now(), false, errorMessage);
}
}equals/hashCode、toString。接下来,我们创建一个 REST 控制器,对外暴露 /api/chat 接口。
路径:src/main/java/com/example/chatbot/controller/ChatController.java
package com.example.chatbot.controller;
import com.example.chatbot.dto.ChatRequest;
import com.example.chatbot.dto.ChatResponse;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.*;
/**
* 聊天控制器:提供基础聊天 API
*/
@RestController
@RequestMapping("/api/chat")
public class ChatController {
private final ChatModel chatModel;
// 构造方法注入 ChatModel
public ChatController(ChatModel chatModel) {
this.chatModel = chatModel;
}
/**
* 基础聊天接口
* POST /api/chat
*/
@PostMapping
public ChatResponse chat(@RequestBody ChatRequest request) {
try {
// 1️⃣ 参数校验
request.validate();
// 2️⃣ 调用大模型
String aiResponse = chatModel.call(request.message());
// 3️⃣ 返回成功响应
return ChatResponse.success(aiResponse);
} catch (IllegalArgumentException e) {
// 参数错误
return ChatResponse.error("参数错误: " + e.getMessage());
} catch (Exception e) {
// 其他错误
return ChatResponse.error("服务器错误: " + e.getMessage());
}
}
/**
* 健康检查接口:GET /api/chat/health
*/
@GetMapping("/health")
public String health() {
return "Chat API is running! 🚀";
}
}@RestController:返回值自动序列化为 JSON。@RequestMapping("/api/chat"):统一前缀,便于管理接口。ChatModel 由 Spring AI 和 Spring Boot 自动注入。ChatResponse.success / ChatResponse.error 统一响应格式。现在启动应用,并用 curl 进行最基础的接口测试。
mvn spring-boot:run看到控制台输出 Started AiChatbotApplication 和欢迎 ASCII 即表示启动成功。
curl http://localhost:8080/api/chat/health预期输出:
Chat API is running! 🚀curl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-d '{"message": "你好,请介绍一下你自己"}'预期返回的 JSON 类似:
{
"message": "你好!我是通义千问,由阿里云开发的 AI 助手...",
"timestamp": "2024-01-01T12:34:56",
"success": true,
"error": null
}curl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-d '{"message": ""}'预期输出:
{
"message": null,
"timestamp": "2024-01-01T12:34:56",
"success": false,
"error": "参数错误: 消息不能为空"
}完成本章后,你的项目结构大致如下:
src/
├── main/
│ ├── java/com/example/chatbot/
│ │ ├── AiChatbotApplication.java # 主类
│ │ ├── controller/
│ │ │ └── ChatController.java # 聊天控制器
│ │ └── dto/
│ │ ├── ChatRequest.java # 请求 DTO
│ │ └── ChatResponse.java # 响应 DTO
│ └── resources/
│ ├── application.yml
│ └── static/
│ ├── index.html
│ ├── app.js
│ └── style.css
└── test/
└── java/com/example/chatbot/
└── knowledge/
└── Test01_SpringAIBasics.java # 第1章中的测试类curl 完成了健康检查和多种问题的接口测试。