首页 > 解决方案 > Volley StringRequest 有效,但将其更改为 JsonObjectRequest 会导致 com.android.volley.ClientError

问题描述

请注意,我刚刚开始使用 Kotlin

我有一个 .NET API,它设置了标准的开箱即用的基于 .NET 令牌的单用户帐户身份验证。

假设 API 运行良好,因为所有这些都已被验证为使用 Postman 工作:

邮差

以下代码正在运行,它是在 Volley 中完成的简单 StringRequest:

    val registerRequest = object : StringRequest(Method.POST, TOKEN_URL, Response.Listener { response ->
            Log.i("SmackChatAPI", response)
            var tokenresponse = ""
            token(tokenresponse)
        }, Response.ErrorListener { response ->
            Log.i("SmackChatAPI", "Something went wrong")
            Log.i("SmackChatAPI", response.toString())
            token("")
        }){
            override fun getHeaders(): MutableMap<String, String> {
                var map : MutableMap<String, String> = mutableMapOf<String, String>()
                //map.put("Content-Type", "application/x-www-form-urlencoded")
                return map
            }

            override fun getBodyContentType(): String {
                return "application/x-www-form-urlencoded charset=utf-8"
                //return "application/json; charset=utf-8"
            }


            override fun getParams(): MutableMap<String, String> {
                var map : MutableMap<String, String> = mutableMapOf<String, String>()
                map.put("grant_type","password")
                map.put("username",username)
                map.put("password",password)
                return map
            }
        }
        Log.i("SmackChatAPI", "API called")

        Volley.newRequestQueue(context).add(registerRequest)

验证上述代码是否正常工作:

亚行外壳

但是很自然,看到这是接收 JSON,我需要能够解析它,但是第二次我将函数调用转换为 aJsonObjectRequest我得到了

com.android.volley.ClientError

这是同一 API 的故障代码:

        val registerRequest = object : JsonObjectRequest(Method.POST, TOKEN_URL, null, Response.Listener { response ->

        var tokenresponse = response.getString("access_token")
        token(tokenresponse)
    }, Response.ErrorListener { response ->
        Log.i("SmackChatAPI", "Something went wrong")
        Log.i("SmackChatAPI", response.toString())
        token("")
    }){
        override fun getHeaders(): MutableMap<String, String> {
            var map : MutableMap<String, String> = mutableMapOf<String, String>()
            //map.put("Content-Type", "application/x-www-form-urlencoded")
            return map
        }

        override fun getBodyContentType(): String {
            return "application/x-www-form-urlencoded charset=utf-8"
            //return "application/json; charset=utf-8"
        }

        override fun getParams(): MutableMap<String, String> {
            var map : MutableMap<String, String> = mutableMapOf<String, String>()
            map.put("grant_type","password")
            map.put("username",username)
            map.put("password",password)
            return map
        }
    }
    Log.i("SmackChatAPI", "API called")

    Volley.newRequestQueue(context).add(registerRequest)

正如你所看到的,所有改变的是我现在使用的是JsonBodyRequest

JsonBodyRequest 结果

谁能看到我做错了什么?

标签: androidjsonkotlinandroid-volleyasp.net-apicontroller

解决方案


推荐阅读