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

问题描述 投票:4回答:2

我有一段代码:

    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

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

kotlin okhttp okhttp3
2个回答
10
投票

string()不是有效的Kotlin(或Java)方法,因为两种语言都没有定义它。它由qhxswpoi中的OkHttp定义,它是获取类的实际字符串值的正确方法。它不会覆盖ResponseBody,这意味着调用toString会转到toString(),它会以你得到的形式返回对象。确切地说,它返回对象的十六进制表示。

TL:DR; Java或Kotlin没有定义Object方法,OkHttp库在string()类中。 ResponseBody未被覆盖,使其返回类的十六进制表示而不是正文的字符串值。使用toString而不是string()


3
投票

根据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 for Object.toString()

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

© www.soinside.com 2019 - 2024. All rights reserved.