在Android Kotlin项目中集成ChatGPT API遇404错误求助
解决Android集成ChatGPT API时的404响应错误
我想要在Android的简单Activity中集成ChatGPT API,目前遇到无法获取响应的问题,Logcat中显示错误信息“Unexpected response code: 404”。我的Activity包含用于展示响应的TextView、输入问题的EditText以及触发接口调用的Button,以下是我编写的getResponse函数:
private fun getResponse(question: String, callback: (String) -> Unit) { val apiKey = "my api key" val url = "https://api.openai.com/v1/completions" val requestBody = """ { "model": "text-davinci-003", "prompt": "$question", "max_tokens": 500, "temperature": 0 } """.trimIndent() val request = Request.Builder() .url(url) .addHeader("Content-Type", "application/json") .addHeader("Authorization", "Bearer $apiKey") .post(requestBody.toRequestBody("application/json".toMediaTypeOrNull())) .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { Log.e("error", "API request failed", e) callback("Failed to get a response") } override fun onResponse(call: Call, response: Response) { response.use { if (!it.isSuccessful) { Log.e("error", "Unexpected response code: ${it.code}") callback("Failed to get a response") return } val body = it.body?.string() if (body == null) { Log.e("error", "Response body is null") callback("Failed to get a response") return } Log.v("data", body) try { val jsonObject = JSONObject(body) val jsonArray: JSONArray = jsonObject.getJSONArray("choices") val textResult = jsonArray.getJSONObject(0).getString("text") callback(textResult.trim()) } catch (e: Exception) { Log.e("error", "Failed to parse JSON", e) callback("Failed to parse response") } } } }) }
排查与解决方案
- 确认模型与端点匹配:
text-davinci-003属于已归档的旧模型,部分新API密钥可能无法访问该模型。建议替换为当前可用的gpt-3.5-turbo-instruct模型,端点仍为https://api.openai.com/v1/completions,确保模型名称拼写正确。 - 验证API密钥有效性:检查密钥是否在OpenAI后台处于活跃状态,是否有足够调用额度,且未被限制访问Completion接口。
- 检查应用网络权限:在
AndroidManifest.xml中确认添加了网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 修复请求体构建方式:手动拼接JSON容易因特殊字符(如引号、换行)导致格式错误,建议用序列化库构建请求体,示例如下:
// 定义数据类 data class CompletionRequest( val model: String, val prompt: String, val max_tokens: Int, val temperature: Double ) // 替换手动拼接的requestBody部分 val requestBody = Gson().toJson(CompletionRequest( model = "gpt-3.5-turbo-instruct", prompt = question, max_tokens = 500, temperature = 0.0 )).toRequestBody("application/json".toMediaTypeOrNull()) - 测试网络连通性:用Postman或浏览器测试
https://api.openai.com/v1/completions是否能正常访问,排除地区网络限制或代理问题。
内容的提问来源于stack exchange,提问作者user24936837
相关产品推荐
相关产品推荐

