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

如何获取Retrofit请求的ResponseBody文本?Android注册App求助

解决Retrofit无法提取响应文本的问题

你遇到的问题很常见——当使用Call<ResponseBody>时,直接把response.body()转成字符串只会得到OkHttp ResponseBody对象的标识,而不是实际的响应内容。这是因为ResponseBody的默认toString()方法不会返回它包含的文本,你需要主动调用它的string()方法来读取内容。

方法一:直接读取ResponseBody的内容

修改你的onResponse方法,调用response.body().string()来获取响应文本,同时注意两个关键点:

  • string()方法会抛出IOException,需要捕获处理
  • string()只能调用一次(因为它会消耗并关闭响应流),所以最好先把内容存到变量中再使用

修改后的代码如下:

@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
    if (response.isSuccessful()) {
        try {
            // 读取响应内容,注意string()仅能调用一次
            String responseText = response.body().string();
            Toast.makeText(getContext(), responseText, Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getContext(), "Failed to read response content", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(getContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
    }
}

方法二:创建响应模型类(更推荐)

Retrofit的最佳实践是创建与后端响应结构匹配的模型类,让Gson转换器自动帮你解析内容,不用手动处理ResponseBody。

假设你的后端返回的是JSON格式(比如{"message": "Registration Successfully completed"}),先创建响应模型类:

public class RegistrationResponse {
    @SerializedName("message")
    @Expose
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

然后更新SupportopApi接口的返回类型:

public interface SupportopApi {
    @POST("/api/registration")
    Call<RegistrationResponse> registration (@Body SupportopObj supportopObj);
}

同步修改ApiClient中的对应方法:

public Call<RegistrationResponse> registration(SupportopObj supportopObj) {
    return supportopApi.registration(supportopObj);
}

最后修改Fragment中的onResponse逻辑,直接获取解析后的提示文本:

@Override
public void onResponse(Call<RegistrationResponse> call, Response<RegistrationResponse> response) {
    if (response.isSuccessful()) {
        String successMessage = response.body().getMessage();
        Toast.makeText(getContext(), successMessage, Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
    }
}

这种方式更优雅,既避免了手动处理流和异常的麻烦,也符合Retrofit的设计理念。

补充:为什么Call<Void>会返回null?

当你使用Call<Void>时,Retrofit会默认认为响应体是空的,因此response.body()自然返回null——因为Void类型本身没有实例。这种方式仅适用于不需要获取响应内容的场景,显然你的场景不适用。

内容的提问来源于stack exchange,提问作者Hayk Mkrtchyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:02