我有一段代码:
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
try {
Log.d("DEBUG POST=====>", response.body()!!.string())
}catch(e:IOException) {
e.printStackTrace()
}
}
当我使用response.body()!!.string()
时,我得到正确的输出和JSON正文。
当我使用:response.body().toString()
时,我得到okhttp3.ResponseBody$1@c626d25
有谁可以告诉我这两种方法有什么区别?
答案 0 :(得分:10)
string()
不是有效的Kotlin(或Java)方法,因为两种语言都没有定义它。它由OkHttp在ResponseBody
中定义,它是获取类的实际字符串值的正确方法。它不会覆盖toString
,这意味着对toString()
的调用转到Object
,它会以您所获得的形式返回对象。确切地说,它返回对象的十六进制表示。
TL:DR; Java或Kotlin没有定义string()
方法,OkHttp库在ResponseBody
类中定义。 toString
未被覆盖,使其返回类的十六进制表示而不是正文的字符串值。使用string()
而非toString()
答案 1 :(得分:3)
根据documentation for OkHttp's ResponseBody,string()
功能:
将响应作为使用Content-Type标头的字符集解码的字符串返回。如果该标头不存在或缺少字符集,则会尝试根据其BOM或UTF-8对响应主体进行解码。自动关闭ResponseBody。
相比之下,所有Java / Kotlin对象上的toString()
方法在这种情况下都没有为ResponseBody
定义。在这种情况下,将调用java.lang.Object
上的版本,其标准实现是发出对象的类名和对象的哈希码(为十六进制)。
来自JavaDoc for Object.toString()
:
返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都覆盖此方法。
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
简而言之,这些方法故意做不同的事情。