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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:37:02