如何获取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
相关产品推荐
相关产品推荐

