
Spring Boot 集成通义千问 API 实战打造专属 Java 智能问答工具在 AI 大模型普及的当下Java 程序员如何快速将大模型能力集成到自己的项目中本文以通义千问 API 为例手把手教你用 Spring Boot 搭建一个简单易用的智能问答工具涵盖 API 调用、请求封装、流式响应、异常处理等核心知识点全程实战可复现新手也能轻松上手。本文适合 Java 开发新手、Spring Boot 学习者以及想快速接入大模型 API 的开发者。读完本文你将掌握通义千问 API 申请流程、Spring Boot 集成 HTTP 请求、大模型请求/响应封装、流式输出实现以及实际开发中的避坑技巧同时也能为你的 JavaAI 副业积累实战案例。一、前置准备必做1. 申请通义千问 API 密钥要调用通义千问 API首先需要获取 API Key 和 Secret Key步骤如下访问 通义千问官网注册并登录阿里云账号已有账号可直接登录进入「控制台」找到「通义千问 API」模块开通 API 服务新用户有免费调用额度足够用于测试在「AccessKey 管理」中创建 AccessKey记录下API Key和Secret Key后续配置使用请勿泄露。注意API Key 和 Secret Key 是调用接口的核心凭证建议在项目中通过配置文件管理不要硬编码到代码中避免泄露。2. 环境准备本文使用的开发环境确保你本地已配置完成JDK 1.8 及以上推荐 JDK 11Maven 3.6或 GradleSpring Boot 2.7.x稳定版兼容性更好开发工具IDEA推荐测试工具Postman 或浏览器用于接口测试。二、项目搭建全程实战1. 创建 Spring Boot 项目打开 IDEA创建一个新的 Spring Boot 项目选择「Spring Initializr」配置如下Groupcom.example可自定义Artifactspringboot-tongyi-apiPackagecom.example.tongyiDependencies勾选「Spring Web」用于提供接口、「Lombok」简化代码。创建完成后等待 Maven 下载依赖确保项目无报错。2. 导入核心依赖通义千问 API 调用需要发送 HTTP 请求这里使用 OkHttp 作为 HTTP 客户端比原生 HttpURLConnection 更简洁性能更好在 pom.xml 中添加如下依赖!-- OkHttp 依赖用于发送 HTTP 请求 -- dependency groupIdcom.squareup.okhttp3/groupId artifactIdokhttp/artifactId version4.11.0/version /dependency !-- fastjson 依赖用于 JSON 解析 -- dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version2.0.32/version /dependency !-- lombok 依赖已勾选可忽略 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency添加完成后刷新 Maven 依赖确保依赖下载成功。3. 配置 API 密钥核心步骤在 src/main/resources 目录下的 application.yml 文件中添加通义千问 API 相关配置避免硬编码server: port: 8080 # 项目端口可自定义 tongyi: api-key: 你的API Key secret-key: 你的Secret Key api-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation # 通义千问API地址固定替换配置中的「你的API Key」和「你的Secret Key」为你之前申请的凭证保存配置文件。4. 封装请求/响应实体通义千问 API 有固定的请求格式和响应格式我们需要创建实体类来封装简化代码调用。1请求实体TongyiRequest用于封装调用 API 时需要传递的参数模型、提问内容、生成配置等package com.example.tongyi.entity; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * 通义千问 API 请求实体 */ Data public class TongyiRequest { // 模型版本通义千问默认模型qwen-turbo免费额度可用 private String model qwen-turbo; // 请求参数核心提问内容 private MapString, Object input new HashMap(); // 生成配置温度、最大长度等 private MapString, Object parameters new HashMap(); /** * 构造方法快速创建请求对象 * param prompt 提问内容用户输入 */ public TongyiRequest(String prompt) { // 设置提问内容 this.input.put(prompt, prompt); // 温度0-1值越小回答越精准值越大回答越有创造性 this.parameters.put(temperature, 0.7); // 最大生成长度默认2048可根据需求调整 this.parameters.put(max_tokens, 2048); } }2响应实体TongyiResponse用于接收 API 返回的响应数据只封装核心字段简化开发如需更多字段可参考官方文档扩展package com.example.tongyi.entity; import lombok.Data; import java.util.List; /** * 通义千问 API 响应实体 */ Data public class TongyiResponse { // 响应状态success/failed private String status; // 响应代码200表示成功 private int code; // 响应数据 private DataDTO data; /** * 响应数据详情 */ Data public static class DataDTO { // 生成的回答内容核心 private ListTextDTO text; Data public static class TextDTO { private String content; } } /** * 快速获取回答内容 * return 大模型生成的回答 */ public String getAnswer() { if (this.data null || this.data.getText() null || this.data.getText().isEmpty()) { return 未获取到回答请稍后重试; } return this.data.getText().get(0).getContent(); } }5. 封装 API 调用工具类核心逻辑创建工具类 TongyiApiUtil封装 OkHttp 请求、签名生成通义千问 API 需要签名验证、API 调用逻辑供后续接口调用package com.example.tongyi.util; import com.alibaba.fastjson.JSON; import com.example.tongyi.entity.TongyiRequest; import com.example.tongyi.entity.TongyiResponse; import okhttp3.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.concurrent.TimeUnit; /** * 通义千问 API 调用工具类 */ Component public class TongyiApiUtil { // 从配置文件中读取 API 相关信息 Value(${tongyi.api-key}) private String apiKey; Value(${tongyi.secret-key}) private String secretKey; Value(${tongyi.api-url}) private String apiUrl; // 初始化 OkHttp 客户端 private final OkHttpClient okHttpClient new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) // 连接超时 .readTimeout(60, TimeUnit.SECONDS) // 读取超时 .build(); /** * 调用通义千问 API获取回答 * param prompt 提问内容 * return 大模型生成的回答 */ public String callTongyiApi(String prompt) { try { // 1. 创建请求实体 TongyiRequest request new TongyiRequest(prompt); // 2. 将请求实体转为 JSON 字符串 String requestBody JSON.toJSONString(request); // 3. 生成请求头包含签名 Headers headers generateHeaders(requestBody); // 4. 构建请求 Request okRequest new Request.Builder() .url(apiUrl) .headers(headers) .post(RequestBody.create(MediaType.parse(application/json;charsetutf-8), requestBody)) .build(); // 5. 发送请求并获取响应 Response response okHttpClient.newCall(okRequest).execute(); // 6. 解析响应 if (response.isSuccessful() response.body() ! null) { String responseBody response.body().string(); TongyiResponse tongyiResponse JSON.parseObject(responseBody, TongyiResponse.class); // 判断响应状态 if (success.equals(tongyiResponse.getStatus()) tongyiResponse.getCode() 200) { return tongyiResponse.getAnswer(); } else { return API 调用失败 tongyiResponse.getStatus() 错误码 tongyiResponse.getCode(); } } else { return API 调用失败响应状态 response.code(); } } catch (Exception e) { e.printStackTrace(); return API 调用异常 e.getMessage(); } } /** * 生成通义千问 API 请求头包含签名必做步骤 * param requestBody 请求体 JSON 字符串 * return 请求头 * throws Exception 签名生成异常 */ private Headers generateHeaders(String requestBody) throws Exception { // 当前时间戳毫秒 String timestamp String.valueOf(System.currentTimeMillis()); // 生成签名通义千问 API 签名规则HMAC-SHA256 加密 String signature generateSignature(requestBody, timestamp); // 构建请求头 return new Headers.Builder() .add(X-Dashscope-Date, timestamp) .add(X-Dashscope-Key, apiKey) .add(X-Dashscope-Signature, signature) .add(Content-Type, application/json;charsetutf-8) .build(); } /** * 生成签名 * param requestBody 请求体 * param timestamp 时间戳 * return 签名字符串 * throws Exception 加密异常 */ private String generateSignature(String requestBody, String timestamp) throws Exception { // 签名原文timestamp \n requestBody String signatureSource timestamp \n requestBody; // HMAC-SHA256 加密 Mac mac Mac.getInstance(HmacSHA256); mac.init(new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), HmacSHA256)); byte[] signatureBytes mac.doFinal(signatureSource.getBytes(StandardCharsets.UTF_8)); // Base64 编码得到最终签名 return Base64.getEncoder().encodeToString(signatureBytes); } }关键说明通义千问 API 必须添加签名请求头否则会调用失败。签名生成规则是「时间戳 换行 请求体」通过 HMAC-SHA256 加密后进行 Base64 编码工具类中已完整实现直接复用即可。6. 编写接口控制器供前端/测试调用创建控制器 TongyiController提供一个简单的 HTTP 接口接收用户提问调用工具类获取大模型回答返回给用户package com.example.tongyi.controller; import com.example.tongyi.util.TongyiApiUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * 通义千问 API 接口控制器 */ RestController public class TongyiController { Autowired private TongyiApiUtil tongyiApiUtil; /** * 智能问答接口 * param prompt 用户提问内容 * return 大模型回答 */ GetMapping(/api/tongyi/ask) public String ask(RequestParam String prompt) { // 校验参数避免空请求 if (prompt null || prompt.trim().isEmpty()) { return 请输入提问内容; } // 调用 API 并返回结果 return tongyiApiUtil.callTongyiApi(prompt); } }7. 启动项目测试接口1. 启动 Spring Boot 项目运行 SpringbootTongyiApiApplication 类确保项目启动成功控制台无报错显示「Started SpringbootTongyiApiApplication in xxx seconds」2. 测试接口使用 Postman 或浏览器访问接口地址示例请求地址http://localhost:8080/api/tongyi/ask?promptJava如何调用通义千问API3. 查看响应结果接口会返回通义千问生成的回答示例响应Java 调用通义千问 API 主要分为以下步骤\n1. 申请通义千问 API 密钥API Key 和 Secret Key需登录阿里云通义千问官网开通服务并创建 AccessKey\n2. 搭建 Java 开发环境推荐 JDK 8导入 HTTP 客户端依赖如 OkHttp和 JSON 解析依赖如 fastjson\n3. 封装请求实体按照通义千问 API 要求构造请求参数模型版本、提问内容、生成配置等\n4. 生成请求头重点是按照官网规则生成签名HMAC-SHA256 加密 Base64 编码否则接口会调用失败\n5. 发送 HTTP POST 请求到通义千问 API 地址解析响应结果提取大模型生成的回答\n6. 处理异常情况如网络超时、API 调用失败、参数错误等提升接口稳定性。\n\n具体实现可参考相关代码示例核心是做好请求封装和签名生成确保参数格式正确。如果能正常返回回答说明 Spring Boot 集成通义千问 API 成功三、进阶优化可选提升项目实用性1. 实现流式响应优化用户体验目前接口是同步返回完整回答等待时间较长。可以优化为流式响应让大模型的回答逐字返回类似 ChatGPT 的对话体验。核心修改点修改请求实体添加stream: true参数使用 OkHttp 的流式响应解析逐行读取 API 返回的内容控制器返回ResponseEntityFluxString实现流式输出。2. 增加异常处理添加全局异常处理器统一处理 API 调用超时、密钥错误、参数异常等情况返回更友好的提示信息避免项目崩溃。3. 缓存常见问题回答对于高频提问如「Java 基础语法」「Spring Boot 常用注解」可以使用 Redis 缓存回答结果减少 API 调用次数节省额度提升响应速度。4. 搭建简单前端页面可以用 Vue/React 搭建一个简单的对话页面实现「输入提问 显示回答」的交互让项目更完整可作为个人作品集或副业项目的演示案例。四、常见问题与避坑指南API 调用失败提示「签名错误」检查 Secret Key 是否正确签名生成逻辑是否正确重点是时间戳格式、请求体是否和签名原文一致响应超时调整 OkHttp 的超时时间工具类中已设置 30 秒连接超时、60 秒读取超时可根据需求调整返回「额度不足」新用户免费额度有限可前往通义千问官网充值或切换为免费可用的模型如 qwen-turbo代码报错「找不到依赖」检查 Maven 依赖是否正确导入刷新 Maven 仓库确保依赖下载成功请求参数错误确保请求实体中的 model 字段正确免费模型为 qwen-turbomax_tokens 不超过 API 限制默认 2048。五、总结与延伸本文通过 Spring Boot 集成通义千问 API实现了一个简单的智能问答工具核心掌握了「API 申请 配置管理 请求封装 签名生成 接口调用」的完整流程。这个案例不仅是 Java 集成大模型的入门实战也可以作为你的 JavaAI 副业项目的基础——在此基础上你可以扩展功能打造专属的智能客服、代码生成器、技术问答工具等实现副业变现。延伸方向集成其他大模型 API如 GPT、文心一言实现多模型切换开发批量提问、回答导出功能适配企业场景将项目部署到云服务器如阿里云、腾讯云对外提供服务通过广告、付费使用实现变现。最后附上本文完整源码地址GitHubhttps://github.com/xxx/springboot-tongyi-api替换为你的 GitHub 地址可直接克隆运行。如果在实践过程中遇到问题欢迎在评论区留言一起交流学习觉得有用的话记得点赞 收藏关注我后续持续分享 Java AI 实战干货和副业赚钱技巧