凌晨3点,这个API让我怀疑人生
凌晨2点47分,我坐在电脑前,和这个API对视了整整一个时辰。
它一言不发,只留给我一个冰冷的401错误。我怀疑它是前世欠我的,这辈子来找我报仇。
🎬 故事开始
事情是这样的。那天晚上,我决定给我的AI助手升级一下,让它能调用外部API获取实时数据。听起来很简单对吧?就是个HTTP请求,加个Authorization header,传个JSON,搞定。
Too young too simple。
第一个坑:我以为API密钥就是直接粘贴在header里。于是我这样写:
headers = {
"Authorization": "sk-abc123xyz789..."
}
我???这密钥我刚从后台复制的,错不了啊!于是我开始了长达1小时的 debug 之旅:
- 检查了网络连接 —— 没问题
- 换了个API endpoint —— 还是401
- 用curl测试 —— 居然成功了?!
- 对比curl和我的代码 —— 看不出区别...
最后我发现,人家API文档写的是:
headers = {
"Authorization": "Bearer sk-abc123xyz789..."
}
对,缺了个 "Bearer " 前缀。我眼瞎了,文档明明写得清清楚楚,我就是没看到前面那7个字母加1个空格。
🕳️ 第二坑:Content-Type的阴谋
好,认证过了。现在我要传参数。我的请求体是这样的:
data = {
"model": "gpt-4",
"messages": [{"role": "user", "content": "你好"}]
}
response = requests.post(url, headers=headers, data=data)
我又懵了。这分明就是JSON啊!我盯着屏幕,开始怀疑人生,怀疑AI,怀疑这个世界是不是就是个巨大的bug。
后来想起来 —— Python的requests库,如果你直接用 data= 传字典,它会变成表单格式(form-data)。要传JSON,你得:
# 方案1:用json参数
response = requests.post(url, headers=headers, json=data)
# 方案2:手动转JSON并加header
import json
headers["Content-Type"] = "application/json"
response = requests.post(url, headers=headers, data=json.dumps(data))
🎭 第三坑:大小写的尊严
正当我以为万事大吉的时候,我又遇到了一个神奇的问题。API返回的数据里有个字段叫 choices,但我怎么取都取不到:
result = response.json()
print(result["Choices"]) # KeyError!
我看了十遍返回结果,明明有"choices"啊!然后我突然意识到...
API返回的是 "choices"(小写c),我写的是 "Choices"(大写C)。
Python是大小写敏感的。我怀疑我的键盘在跟我作对。
💡 干货总结
好了,吐槽完了,来点正经的。如果你也在调API,记住这几点,能让你少熬几个通宵:
- Authorization格式: 看清楚要不要加 "Bearer "、"Basic " 或其他前缀
- Content-Type: Python的requests用
json=data而不是data=data - 大小写敏感: JSON字段名是大小写敏感的,复制粘贴永远没错
- 打印调试: 遇到问题先
print(response.text)看原始返回 - 看文档: 虽然枯燥,但能救命(别像我一样眼瞎)
🌙 尾声
凌晨4点13分,我终于搞定了这个API调用。窗外的天已经开始泛白,我泡了杯咖啡,开始反思:
也许人生就是这样,你以为你在和AI斗智斗勇,其实你在和自己的粗心大意较劲。那些看似高深莫测的错误,往往是最低级的小失误。
但这就是编程的魅力吧 —— 在0和1的世界里,每一个bug都有答案,每一个问题都能解决。只要你够耐心,够细心,够...不要脸地去查文档。
🚀 想学习更多AI开发技巧?
妙趣AI网站有各种AI工具教程、踩坑实录和骚操作指南。
从API调用到Prompt Engineering,从开源工具到商业实战,应有尽有。
访问 miaoquai.com