You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中用Volley添加授权Header做邮箱验证码验证报错求助

问题分析与修复方案

看起来你遇到的服务器错误,核心原因是把Bearer Token放错了位置——你现在把它塞进了请求体里,但按照API的设计(以及HTTP认证的标准规范),Token应该放在请求头中,而请求体只需要传递code字段就可以了。

我帮你修正了代码,同时优化了一些逻辑细节:

var codeEntered: String? = null
txt_pin_entry.setOnPinEnteredListener {
    codeEntered = "$it"
    Toast.makeText(context!!.applicationContext, "验证码已输入: $codeEntered", Toast.LENGTH_SHORT).show()
}

submitBtn.setOnClickListener {
    // 先检查验证码是否为空,避免无效请求
    if (codeEntered.isNullOrEmpty()) {
        Toast.makeText(context!!.applicationContext, "请输入验证码", Toast.LENGTH_SHORT).show()
        return@setOnClickListener
    }

    val url = "https://fathomless-badlands-69782.herokuapp.com/api/auth/verify"
    
    // 请求体只保留API要求的code字段
    val params = HashMap<String, String?>()
    params["code"] = codeEntered
    val jsonObject = JSONObject(params as Map<*, *>)

    val request = object : JsonObjectRequest(Request.Method.PUT, url, jsonObject,
        Response.Listener { response ->
            try {
                Log.i("Registration", "验证响应: $response")
                // 只有验证成功后才跳转页面
                val actionToVerificationResult = CodeVerificationFragmentDirections.actionToVerificationResult()
                Navigation.findNavController(it).navigate(actionToVerificationResult)
                Toast.makeText(context!!.applicationContext, "验证成功!", Toast.LENGTH_SHORT).show()
            } catch (e: Exception) {
                Log.e("Registration", "解析响应失败: ${e.message}")
                Toast.makeText(context!!.applicationContext, "解析响应出错", Toast.LENGTH_SHORT).show()
            }
        },
        Response.ErrorListener { error ->
            Log.e("Registration", "验证错误: ${error.message}")
            Toast.makeText(context!!.applicationContext, "验证失败,请检查验证码或网络", Toast.LENGTH_SHORT).show()
        }) {
        // 重写getHeaders方法,把Bearer Token放在请求头里
        override fun getHeaders(): MutableMap<String, String> {
            val headers = HashMap<String, String>()
            headers["Authorization"] = "Bearer $tokenCode"
            return headers
        }
    }

    VolleySingleton.getInstance(context!!.applicationContext).addToRequestQueue(request)
}

关键修改点说明:

  • 修正Token位置:通过重写getHeaders()方法,将Authorization Bearer Token放在HTTP请求头中,这是符合REST API认证规范的正确做法
  • 精简请求体:请求体只保留code字段,完全匹配API期望的{ code: String }格式
  • 增加前置校验:点击按钮前先检查验证码是否为空,避免发送无效请求
  • 调整跳转时机:把页面跳转逻辑移到请求成功的回调里,确保只有验证通过后才跳转到结果页面,避免请求未完成就跳转的问题
  • 优化日志与提示:更清晰的日志信息和用户提示,方便排查问题

另外还要注意:确保tokenCode是有效的、未过期的,并且格式正确(不要漏掉Bearer 前缀)。

内容的提问来源于stack exchange,提问作者Darotudeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:00:08