首先声明,我只是个小小的大三学生,我是小菜鸡,补药喷我。
今天是我做AI翻译工具的第一天。本以为调个API很简单,没想到一路从401走到402,最后卡在404。这篇文章记录我从“无从下手”到“成功调通”的全过程,希望能帮到同样踩坑的你。
第一阶段:信心满满 → 401(认证失败)
场景:
Spring Boot 项目配好,API Key 复制粘贴,启动,访问接口。
结果:
浏览器弹出 500,控制台一堆红字,隐约看到 401 - API Key invalid。
排查:
我反复检查 application.properties,Key 没写错啊。
后来发现——复制的时候,前面多了一个空格。
对,一个空格。
解决:
去掉空格,重启,再试。
还是 401。
这次是 Key 本身失效了(之前注册时生成的,可能过期了)。
最终:
去官网重新生成 Key,这次小心翼翼复制,确认前后无空格。
启动,访问——
401 没了,变成了 402。
收获:
- API Key 前后不能有空格,连换行符都不行
- 401 不一定是你写错,也可能是 Key 本身失效了
- 看到 401,先去官网重新生成一个,别犹豫
第二阶段:继续尝试 → 402(余额不足)
场景:
换了新 Key,满怀期待地重启。
结果:
控制台输出 402 - Insufficient Balance。
内心:???我还没用呢,怎么就欠费了?
排查:
登录 DeepSeek 控制台,点开「账单」——余额:0.00 元。
解决:
换平台。
搜了一圈,选了阿里云 DashScope,新用户送 100 万 tokens,够我折腾很久。
收获:
- 402 就是“没钱了”,别怀疑代码,去充值或换平台
- 选平台时留意免费额度,学生党能省则省
- 402 比 401 好,至少说明 Key 是对的
第三阶段:换平台 → 404(地址不存在)
场景:
阿里云开通,拿到 AccessKeySecret,配好 application.properties,重启。
结果:
还是 500。
这次是 404。
内心:???我 Key 对了,也有钱,怎么还不行?
排查:
我开始怀疑 base-url 和 model 是不是写错了。
各种尝试:
qwen-turbo、qwen-max、qwen-plushttps://dashscope.aliyuncs.com/compatible-mode/v1https://dashscope.aliyuncs.com/v1
全试了一遍,全是 404。
转机:
朋友说:“你用 curl 直接调一下,别用代码。”
我打开命令行,敲了一行:
bash
curl -X GET https://dashscope.aliyuncs.com/compatible-mode/v1/models \
-H "Authorization: Bearer 我自己的AccessKeySecret"
返回了一大串 JSON,里面整整齐齐列着所有可用模型。
原来我的 Key 没问题,地址也没问题,只是 model 名没选对。
解决:
从返回的列表里挑了一个最顺眼的:qwen-plus。
改配置,重启——
还是 404。
收获:
- 404 可能是地址错,也可能是模型名错
- 用 curl 直接调 API,绕过代码,能快速定位问题
- 别盲目相信框架的自动配置,先验证 API 本身通不通
第四阶段:最后一公里 → 手动调用
场景:
明明 curl 能通,Java 代码就是不行。
Spring AI 的自动配置像个黑盒,报错信息也不够直观。
决定:
不用框架了,自己手动调。
代码(这是最终能跑的那一版):
java
RestClient client = RestClient.create();
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", "qwen-plus");
Map<String, String> userMessage = new HashMap<>();
userMessage.put("role", "user");
userMessage.put("content", message);
requestBody.put("messages", Arrays.asList(userMessage));
Map response = client.post()
.uri("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions")
.header(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.body(requestBody)
.retrieve()
.body(Map.class);
结果:
浏览器终于返回了 AI 的回复。
那一刻,真的有点感动。
收获:
- 框架不是万能的,必要时自己动手更可控
- RestClient 比 RestTemplate 好用,推荐试试
- 能手动调通 API,才算真正理解了 HTTP 调用
写在最后
这一天,我从 401 走到 402,最后卡在 404,折腾了整整一个下午。
但收获也很大:
- ✅ 看懂 HTTP 状态码:401、402、404 不再是天书
- ✅ 学会用 curl 调试 API,比盲目改代码快得多
- ✅ 手动调用 REST API,不再依赖框架封装
- ✅ 换平台、配 Key、选模型,流程走了好几遍,再也不会忘
现在我的 AI 翻译工具终于能跑了。
下一步准备加数据库、做前端、部署上线。
如果你也在做 AI 项目,或者也遇到了 401、402、404,欢迎留言交流。
一起踩坑,一起爬坑。