【问题标题】:Sending a header for authorization with Volley in Android using Kotlin使用 Kotlin 在 Android 中通过 Volley 发送授权标头
【发布时间】:2020-03-24 19:51:17
【问题描述】:

我正在尝试通过在提交注​​册详细信息后发送到他们电子邮件的验证码来验证用户身份。

我有以下代码来收听通过电子邮件收到的代码/pin,但我不确定我是否以正确的方式添加标头/承载令牌,因为我在验证时收到服务器错误。

请帮忙


        var codeEntered:String? = null

        txt_pin_entry.setOnPinEnteredListener {
            codeEntered = "$it"
            Toast.makeText(context!!.applicationContext, "inside $codeEntered", Toast.LENGTH_SHORT).show()
        }

        submitBtn.setOnClickListener {


            val url = "https://fathomless-badlands-69782.herokuapp.com/api/auth/verify"
            val params = HashMap<String, String?>()
            params["Authorization"] = "Bearer $tokenCode"
            params["code"] = codeEntered


            Toast.makeText(context!!.applicationContext, "outside $codeEntered", Toast.LENGTH_SHORT).show()


            val jsonObject = JSONObject(params as Map<*, *>)

            val request = JsonObjectRequest(Request.Method.PUT, url, jsonObject,
                Response.Listener { response ->
                    try{
                        Log.i("Registration", "Response $response")

                    }catch (e: Exception){
                        Log.e("Registration", "Response $e")
                        Toast.makeText(context!!.applicationContext, "Response $response", Toast.LENGTH_SHORT).show()
                    }
                }, Response.ErrorListener {
                    Log.e("Registration", "Response $it")
                    Toast.makeText(context!!.applicationContext, "Response $it", Toast.LENGTH_SHORT).show()
                })



            VolleySingleton.getInstance(context!!.applicationContext).addToRequestQueue(request)
            val actionToVerificationResult = CodeVerificationFragmentDirections.actionToVerificationResult()
            Navigation.findNavController(it).navigate(actionToVerificationResult)
        }

    }

API 需要如下请求

{
  code: String
}

【问题讨论】:

  • 问题是,为什么要使用 Volley,什么时候可以使用 Retrofit?

标签: java android android-fragments kotlin android-volley


【解决方案1】:

返回标头或覆盖 getHeaders

  val request = JsonObjectRequest(Request.Method.PUT, url, jsonObject,
            Response.Listener { response ->
                try{
                    Log.i("Registration", "Response $response")

                }catch (e: Exception){
                    Log.e("Registration", "Response $e")
                    Toast.makeText(context!!.applicationContext, "Response $response", Toast.LENGTH_SHORT).show()
                }
            }, Response.ErrorListener {
                Log.e("Registration", "Response $it")
                Toast.makeText(context!!.applicationContext, "Response $it", Toast.LENGTH_SHORT).show()
            }){
   @Throws(AuthFailureError::class)
        override fun getHeaders(): Map<String, String> {
            val headers = HashMap<String, String>()
            headers.put("Content-Type", "application/json")
            headers.put("Authorization", "Bearer $tokenCode")
            return headers
  }

【讨论】:

    【解决方案2】:

    你试过下面这个吗

    override fun getHeaders(): MutableMap<String, String> {
                val headers = HashMap<String, String>()
                headers["code"] = Your code
                return headers
            }
    

    示例:

    class ServiceVolley : ServiceInterface {
        val TAG = ServiceVolley::class.java.simpleName
        val basePath = "https://your/backend/api/"
    
        override fun post(path: String, params: JSONObject, completionHandler: (response: JSONObject?) -> Unit) {
            val jsonObjReq = object : JsonObjectRequest(Method.POST, basePath + path, params,
                    Response.Listener<JSONObject> { response ->
                        Log.d(TAG, "/post request OK! Response: $response")
                        completionHandler(response)
                    },
                    Response.ErrorListener { error ->
                        VolleyLog.e(TAG, "/post request fail! Error: ${error.message}")
                        completionHandler(null)
                    }) {
                @Throws(AuthFailureError::class)
                override fun getHeaders(): Map<String, String> {
                    val headers = HashMap<String, String>()
                    headers.put("Content-Type", "application/json")
                    return headers
                }
            }
    
            BackendVolley.instance?.addToRequestQueue(jsonObjReq, TAG)
        }
    }
    

    【讨论】:

    • 请问在哪里插入getHeaders函数?
    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2023-02-23
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多