Android 如何在kotlin中通过改造2获得json

Android 如何在kotlin中通过改造2获得json,android,kotlin,retrofit,retrofit2,retrofit2.6,Android,Kotlin,Retrofit,Retrofit2,Retrofit2.6,我使用2连接到api并接收数据 数据是嵌套的 D/OkHttp: {"success":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9}} 如果数据如上例所示,则接收时不会出现任何问题 但如果它如下所示,则会给出一个错误 D/OkHttp: {"message":"Unauthenticated."} 我这样做是为了第一个例子 data class Resp

我使用2连接到api并接收数据 数据是嵌套的

D/OkHttp: {"success":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9}}
如果数据如上例所示,则接收时不会出现任何问题 但如果它如下所示,则会给出一个错误

D/OkHttp: {"message":"Unauthenticated."}
我这样做是为了第一个例子

data class Response(var success : AutoLoginUser)
data class AutoLoginUser(var token: String)
...
...
...
Log.w("OK FROM SERVER", response.body()!!.success!!.token)
对于第二个例子,我做了以下工作

data class UserDetails(var message : String)
...
...
...
Log.w("OK FROM SERVER", response.body()!!.message)
我在第二个示例中得到的错误

D/OkHttp: <-- 401 Unauthorized http://192.168.1.8/api/details (252ms)
Host: 192.168.1.8
Date: Wed, 02 Dec 2020 09:01:03 GMT
Connection: close
X-Powered-By: PHP/7.4.12
Cache-Control: no-cache, private
Date: Wed, 02 Dec 2020 09:01:03 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
D/OkHttp: {"message":"Unauthenticated."}
<-- END HTTP (30-byte body)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: ir.i9i.splendor, PID: 5740
java.lang.NullPointerException
    at ir.i9i.splendor.Profile$getUserDetails$1.onResponse(Profile.kt:39)
    at   retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

D/OkHttp:您可以使用
onResponse()中的
errorBody()
方法
改装

if (response.code() == 200 && response.isSuccessful) {

                       // do whatever you want when the response is 200 and isSuccessful

                    } else {

                        if (response.errorBody() != null) {

                            val jsonObj =
                                JSONObject(response.errorBody()!!.charStream().readText())
                            val getMessage = jsonObj.getString("message")
                                    
                             // Here get the message and print it out
                            showSnackBar(yourActivity, getMessage)

                        }
                    }

因为您检索了
401
error response,您将能够在
onResponse()
方法中处理此类错误。

不清楚问题所在,但您可能应该在标题中附加API令牌?@lbasek我知道令牌是错误的,如果您使用改型2,尝试使用
response.errorBody()
检查响应。谢谢,它在@lbasek工作