Android集成ChatGPT报错:Failed to load message due to okhttp3.internal.http.RealResponseBody
Android集成ChatGPT时出现"Failed to load message due to okhttp3.internal.http.RealResponseBody"错误的解决方案
我尝试将ChatGPT集成到Android应用中,发送消息后收到错误提示:"Failed to load message due to okhttp3.internal.http.RealResponseBody"。已参考同类问题的解决方案但未解决,以下是使用的代码:
GPTActivity代码
public class GPTActivity extends DrawerBaseActivity { private ActivityGptactivityBinding activityGptactivityBinding; private RecyclerView recyclerViewGPT; private TextView welcomeTextView; private EditText messageEditText; private ImageButton sendButton; private GPTAdapter gptAdapter; private List<Message> messageList; public static final MediaType JSON = MediaType.get("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityGptactivityBinding = activityGptactivityBinding.inflate(getLayoutInflater()); setContentView(activityGptactivityBinding.getRoot()); allocateActivityTitle("ChatGPT"); messageList = new ArrayList<>(); recyclerViewGPT = findViewById(R.id.recyclerviewGPT); welcomeTextView = findViewById(R.id.welcome_text); messageEditText = findViewById(R.id.message_edit_Text); sendButton = findViewById(R.id.send_btn); gptAdapter = new GPTAdapter(messageList); recyclerViewGPT.setAdapter(gptAdapter); LinearLayoutManager llm = new LinearLayoutManager(this); llm.setStackFromEnd(true); recyclerViewGPT.setLayoutManager(llm); sendButton.setOnClickListener((v) -> { String question = messageEditText.getText().toString().trim(); addToChat(question, Message.SENT_BY_USER); messageEditText.setText(""); callAPI(question); welcomeTextView.setVisibility(View.GONE); }); } void addToChat(String message, String sentBy){ runOnUiThread(new Runnable() { @Override public void run(){ messageList.add(new Message(message, sentBy)); gptAdapter.notifyDataSetChanged(); recyclerViewGPT.smoothScrollToPosition(gptAdapter.getItemCount()); } }); } void addResponse(String response){ messageList.remove(messageList.size()-1); addToChat(response, Message.SENT_BY_BOT); } void callAPI(String question){ messageList.add(new Message("Typing... ",Message.SENT_BY_BOT)); JSONObject jsonBody = new JSONObject(); try { jsonBody.put("model", "text-davinci-003"); jsonBody.put("prompt", question); jsonBody.put("max_tokens", 4000); jsonBody.put("temperature", 0); } catch (JSONException e) { throw new RuntimeException(e); } RequestBody body = RequestBody.create(jsonBody.toString(), JSON); Request request = new Request.Builder() .url("https://api.openai.com/v1/completions"). header("Authorization", "Bearer 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"). post(body) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { addResponse("Failed to load message due to " + e.getMessage()); } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { if(response.isSuccessful()){ JSONObject jsonObject = null; try { jsonObject = new JSONObject(response.body().string()); JSONArray jsonArray = jsonObject.getJSONArray("choices"); String result = jsonArray.getJSONObject(0).getString("text"); addResponse(result.trim()); } catch (JSONException e) { throw new RuntimeException(e); } }else{ addResponse("Failed to load message due to " + response.body().toString()); } } }); } }
GPTAdapter代码
public class GPTAdapter extends RecyclerView.Adapter<GPTAdapter.GptViewHolder> { List<Message> messageList; public GPTAdapter(List<Message> messageList) { this.messageList = messageList; } @NonNull @Override public GptViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View chatView = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_item, null); GptViewHolder gptViewHolder = new GptViewHolder(chatView); return gptViewHolder; } @Override public void onBindViewHolder(@NonNull GptViewHolder holder, int position) { Message message = messageList.get(position); if(message.getSentBy().equals(Message.SENT_BY_USER)) { holder.leftChatView.setVisibility(View.GONE); holder.rightChatView.setVisibility(View.VISIBLE); holder.rightTextView.setText(message.getMessage()); }else{ holder.rightChatView.setVisibility(View.GONE); holder.leftChatView.setVisibility(View.VISIBLE); holder.leftTextView.setText(message.getMessage()); } } @Override public int getItemCount() { return messageList.size(); } public class GptViewHolder extends RecyclerView.ViewHolder{ LinearLayout leftChatView, rightChatView; TextView leftTextView, rightTextView; public GptViewHolder(@NonNull View itemView) { super(itemView); leftChatView = itemView.findViewById(R.id.left_chat_view); rightChatView = itemView.findViewById(R.id.right_chat_view); leftTextView = itemView.findViewById(R.id.left_chat_text_view); rightTextView = itemView.findViewById(R.id.right_chat_text_view); } } }
问题分析与修复方案
1. 核心错误原因
错误提示中的RealResponseBody是OkHttp响应体的对象类名,而非实际错误内容。你在非成功响应分支中直接调用response.body().toString(),返回的是对象的字符串表示,而非响应体中的错误信息。
2. 修复代码
修改callAPI方法中的onResponse部分,正确读取响应体内容并处理异常:
@Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { if(response.isSuccessful()){ JSONObject jsonObject = null; try { String responseBody = response.body().string(); jsonObject = new JSONObject(responseBody); JSONArray jsonArray = jsonObject.getJSONArray("choices"); String result = jsonArray.getJSONObject(0).getString("text"); addResponse(result.trim()); } catch (JSONException e) { addResponse("解析响应失败:" + e.getMessage()); } }else{ // 读取错误响应体内容 String errorBody = response.body() != null ? response.body().string() : "未知错误"; addResponse("请求失败:" + response.code() + ",原因:" + errorBody); } }
3. 其他优化建议
- API密钥安全:硬编码API密钥存在泄露风险,建议使用Android Keystore存储密钥。
- 添加网络权限:确保
AndroidManifest.xml中声明了网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 模型更新:
text-davinci-003已被弃用,建议改用gpt-3.5-turbo-instruct模型,若使用Chat Completions接口,需修改请求URL为https://api.openai.com/v1/chat/completions,并调整请求体结构。 - 异常处理优化:将
throw new RuntimeException(e)改为友好的用户提示,避免应用崩溃。
内容的提问来源于stack exchange,提问作者THE BUILDER
相关产品推荐
相关产品推荐

