我有一段代码:
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
有谁可以告诉我这两种方法有什么区别?
string()
不是有效的Kotlin(或Java)方法,因为两种语言都没有定义它。它由qhxswpoi中的OkHttp定义,它是获取类的实际字符串值的正确方法。它不会覆盖ResponseBody
,这意味着调用toString
会转到toString()
,它会以你得到的形式返回对象。确切地说,它返回对象的十六进制表示。
TL:DR; Java或Kotlin没有定义Object
方法,OkHttp库在string()
类中。 ResponseBody
未被覆盖,使其返回类的十六进制表示而不是正文的字符串值。使用toString
而不是string()
根据toString()
,documentation for OkHttp's ResponseBody功能:
将响应作为使用Content-Type标头的字符集解码的字符串返回。如果该标头不存在或缺少字符集,则会尝试根据其BOM或UTF-8对响应主体进行解码。自动关闭ResponseBody。
相反,在所有Java / Kotlin对象上的string()
方法,在这种情况下没有为toString()
定义。在这种情况下,将调用ResponseBody
上的版本,其标准实现是发出对象的类名和对象的哈希码(如hex)。
来自java.lang.Object
:
返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都重写此方法。
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”以及对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串:
JavaDoc forObject.toString()
简而言之,这些方法故意做不同的事情。