《大三学生的AI项目实战:401、402、404都遇上了》

5 阅读4分钟

首先声明,我只是个小小的大三学生,我是小菜鸡,补药喷我。

今天是我做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-turboqwen-maxqwen-plus
  • https://dashscope.aliyuncs.com/compatible-mode/v1
  • https://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,欢迎留言交流。
一起踩坑,一起爬坑。