Android Kotlin集成ChatGPT API遇404/400错误求助排查
排查Android Kotlin调用ChatGPT API的404/400错误
问题背景
- 开发搭载助手功能的Android应用,使用Kotlin调用ChatGPT API时先出现404错误,已确认API密钥正确、未达调用限制、按官方文档配置模型与端点,但问题未解决
- 购买10美元计费套餐后,错误码变为400,原因不明
核心排查方向及解决方案
1. 模型权限与端点匹配检查
- 你当前使用的
gpt-4模型需要账号具备访问权限,新注册账号默认可能无法调用该模型。建议先替换为gpt-3.5-turbo测试,该模型对所有付费账号开放,能快速验证请求链路是否正常 - 确认端点URL正确性:
https://api.openai.com/v1/chat/completions是聊天接口的正确端点,但如果模型与端点不匹配(比如用补全端点调用聊天模型)会触发400错误,你的代码端点配置正确,但模型权限问题是高频诱因
2. 请求体格式验证
- 打印请求体JSON字符串,确认格式符合OpenAI要求。正确格式示例:
检查{ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "你的问题内容"}], "max_tokens": 500 }messages数组结构是否正确,避免出现嵌套错误或字段拼写错误(比如把role写成roles)
3. API密钥与请求头校验
- 确认API密钥无多余空格、换行或隐藏字符:直接粘贴密钥时,有时会附带复制源的格式字符,建议先在纯文本编辑器中清理后再粘贴到代码
- 检查
Authorization头格式:Bearer后必须带空格,再拼接API密钥,你的代码写法"Bearer $apiKey"是正确的,但需确保apiKey变量没有前置空格
4. 应用网络与环境检查
- 确认AndroidManifest.xml中已添加网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 测试设备能否正常访问OpenAI API:用浏览器或Postman发送相同请求,排除地区网络限制或代理问题
5. 错误日志细化
- 在错误分支中打印完整响应体,OpenAI会返回具体错误原因(如模型不存在、权限不足、请求格式错误),修改代码如下:
override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { // 原有成功逻辑 } else { val errorBody = response.body?.string() Log.e("GPT-Error", "Code: ${response.code}, Details: $errorBody") // 新增错误详情打印 if (response.code == 429 && retryCount < 3) { // 原有重试逻辑 } } }
测试用修改代码片段
替换模型并添加请求/错误日志,快速定位问题:
private fun sendMessageToGPT(message: String, chatLayout: LinearLayout, retryCount: Int = 0) { val json = JSONObject().apply { put("model", "gpt-3.5-turbo") // 先测试开放权限模型 put("messages", listOf(mapOf("role" to "user", "content" to message))) put("max_tokens", 500) } Log.d("GPT-Request", json.toString()) // 打印请求体 val requestBody = RequestBody.create("application/json; charset=utf-8".toMediaTypeOrNull(), json.toString()) val request = Request.Builder() .url("https://api.openai.com/v1/chat/completions") .addHeader("Authorization", "Bearer $apiKey") .post(requestBody) .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { e.printStackTrace() Log.e("GPT-Error", "Network fail: ${e.message}") } override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { val responseBody = response.body?.string() Log.d("GPT-Response", responseBody ?: "Empty body") val jsonResponse = JSONObject(responseBody ?: "") val reply = jsonResponse.getJSONArray("choices").getJSONObject(0).getJSONObject("message").getString("content").trim() runOnUiThread { addMessageToChat("AI", reply) } } else { val errorBody = response.body?.string() Log.e("GPT-Error", "Code: ${response.code}, Details: $errorBody") if (response.code == 429 && retryCount < 3) { val backoffTime = Math.pow(2.0, retryCount.toDouble()).toLong() Log.e("GPT-Error", "Rate limit hit, retry in $backoffTime s") Handler(Looper.getMainLooper()).postDelayed({ sendMessageToGPT(message, chatLayout, retryCount + 1) }, backoffTime * 1000) } } } }) }
内容的提问来源于stack exchange,提问作者louboulos
相关产品推荐
相关产品推荐

