OkHttp方法.toString()和.string()之间有什么区别?

时间:2018-02-17 15:49:47

标签: kotlin okhttp okhttp3

我有一段代码:

    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

有谁可以告诉我这两种方法有什么区别?

2 个答案:

答案 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 ResponseBodystring()功能:

  

将响应作为使用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())

简而言之,这些方法故意做不同的事情。