You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:55:05