使用Retrofit配合GsonConverter,我们能很好地将网络响应内容转换成对应的对象。比如像下面这样。
Retrofit网络接口方法
1 |
public interface DroidNetwork { @GET(“/content/helloworld.txt”) |
---|
对应的应用方法
1 |
val retrofit = Retrofit.Builder() val droidNetwork = retrofit.create(DroidNetwork::class.java) droidNetwork.jsonData().enqueue(object : Callback { override fun onResponse(call: Call?, response: Response?) { |
---|
上面的方法执行都很正常,可是执行这个方法的时候就会报错。
1 |
droidNetwork.plainText().enqueue(object : Callback { override fun onResponse(call: Call?, response: Response?) { }) |
---|
崩溃的信息如下
1 |
W System.err: java.lang.Exception: causedByPlainText |
---|
原因其实很简单
- http://asset.droidyue.com/content/test.json 是一个合法的json内容
- https://asset.droidyue.com/content/helloworld.txt 是一个普通的文本,内容为
helloworld
- 因为上面的retrofit 对象 设置了GSONConvertor,会尝试默认将所有的内容转成对应的对象内容,故上面的普通文本就会失败报错。
解决方法有两个
- 修改服务器端的https://asset.droidyue.com/content/helloworld.txt 为JSON内容
- 调整客户端代码支持。
这里我们介绍后者的处理方法,这里我们使用ResponseBody而不是之前的String,然后按照如下代码应用即可。
接口代码
@GET(“/content/helloworld.txt”)
Call plainTextAsResponseBody();
应用代码
droidNetwork.plainTextAsResponseBody().enqueue(object : Callback {
override fun onFailure(call: Call?, t: Throwable?) {
t?.printStackTrace()
}
override fun onResponse(call: Call?, response: Response?) {
dumpMessage(“onResponse of plainTextAsResponseBody content=${response?.body()?.string()}”)
}
})
附加内容
如果在某种情况下,我们只关心请求操作,而不关心响应内容,我们可以这样使用
@GET(“/content/helloworld.txt”)
Call ignoreResult();
上面的代码相对更加高效,因为这里省略了将响应内容转成内存对象的过程。