OKHTTP发起GET/POST请求状态码正常但返回空消息体问题咨询
问题根因
你调用的response.toString()是Response类的默认toString实现,仅会输出响应的基础元信息(协议类型、状态码、请求地址等,也就是你日志中打印的内容),不会返回接口实际返回的响应体内容,这是你拿到空消息的核心原因。
修正方案
要获取接口返回的实际报文内容,需要调用response.body().string()方法读取响应流,注意该方法仅可调用一次,调用后响应流会被自动关闭,重复调用会返回空值。同时建议用try-with-resources语法自动管理响应资源,避免内存泄漏。
同步请求修正代码
public void Get_Synchronous() throws IOException { Request request = new Request.Builder() .url(postman_url) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("请求异常,状态码:" + response.code()); } message_body = response.body().string(); } }
异步请求修正代码
public void Get_Asynchronous() { Request request = new Request.Builder() .url(postman_url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 按需补充请求失败的处理逻辑 e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { try (ResponseBody responseBody = response.body()) { if (!response.isSuccessful()) { throw new IOException("请求异常,状态码:" + response.code()); } message_body = responseBody.string(); // 注意:此处为子线程,如需更新UI请切换到安卓主线程 } } }); }
额外注意事项
- OkHttp的异步回调默认执行在子线程,如果你需要将拿到的响应内容赋值给界面控件,必须通过Handler、runOnUiThread等方式切换到主线程操作,否则会触发线程访问异常。
- 后续如果需要实现文件上传逻辑,可直接使用OkHttp提供的
MultipartBody构建请求体,无需额外适配。
内容的提问来源于stack exchange,提问作者ALirezaSO
相关产品推荐
相关产品推荐

