使用 android 设备时总是收到 401 而不是在 Postman 中

Always getting 401 when using android device but not in Postman

我在 Retrofit 中发送我的令牌作为授权,但我总是收到 401 代码。但是如果我在 Postman 中使用相同的令牌,我可以获得访问权限。我知道我能够访问 webapi,因为我可以很好地登录并能够从 Web Api 获取令牌。请在下面查看我的代码:

Api服务接口

@POST("consolidated/sample")
fun sample(@Header("Authorization") token: String): Call<ResponseBody>

调用服务

private fun pushTransactionsToWebApi() {
       val vApiService = ApiServiceBuillder.buildService(ApiService::class.java)
        CoroutineScope(Main).launch {
            var token = SharedDataManager.getInstance(context!!).applicationToken
            var tokenArr = token!!.split(':')
            responseFromApi = tokenArr[1] ==> I use this so I can remove the word "token" at the beginning of the token string
            token = "Bearer ${responseFromApi}"
            Log.i("TAG", "${token}") ==> ####

            val call = vApiService.sample(token)
            if(!call.isExecuted) {
                call.enqueue(object : Callback<ResponseBody>{
                    override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                        responseFromApi = t.message
                    }

                    override fun onResponse(
                        call: Call<ResponseBody>,
                        response: Response<ResponseBody>
                    ) {
                        if(response.isSuccessful){
                            Toast.makeText(context, "We are OK", Toast.LENGTH_LONG).show()

                        } else {
                            progressDialog!!.dismiss()

                            Toast.makeText(context, "We are NOT OK", Toast.LENGTH_LONG).show()
                        }
                    }
                })
            }
        }
    }

### => 结果在我的 Log.i()

2020-04-08 13:03:09.235 14185-14185/com.kotlin.ambulantlcs I/TAG: Bearer "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI4ODgwNSIsInVzZXJJZCI6IjEiLCJmaXJzdE5hbWUiOiJKdWFuIiwibWlkZGxlTmFtZSI6IkEuIiwibGFzdE5hbWUiOiJEZWxhIENydXoiLCJ0cmFuc2FjdGlvbktleSI6IjJkNjZlYzMxLWI5M2ItNDI2ZC1hMzJlLTM0Yjc4OWE4M2E3OCIsInJldmVudWVEYXRlIjoiMjIvMDMvMjAyMCAyOjI0OjM0IFBNIiwic2hpZnQiOiIyIiwic29zSWQiOiIxMjM0NTYiLCJzb2RJZCI6IjY4IiwicGxhemEiOiI4MDMiLCJoYXNEZXBhcnRlZCI6IkZhbHNlIiwianRpIjoiNjhkMDdmNzEtMThiYy00NmQwLTg3YzEtY2MxMjk4YjgxZDkwIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjpbIlVzZXIiLCJBZG1pbiJdLCJleHAiOjE1ODY0MDg1NzUsImlzcyI6Imh0dHA6Ly8xOTIuMTY4LjEuNDo1MDAwIn0.m1mZw79KLIxq4pZPmBRbN7TjILvhvbUIJOCWDEM8I-k"}

如果我将其粘贴到我的 Postman 中,我可以获得访问权限

我需要做什么?谢谢!

Remove "  " quotes from token
make sure that keys must be same
pass token like as:

Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI4ODgwNSIsInVzZXJJZCI6IjEiLCJmaXJzdE5hbWUiOiJKdWFuIiwibWlkZGxlTmFtZSI6IkEuIiwibGFzdE5hbWUiOiJEZWxhIENydXoiLCJ0cmFuc2FjdGlvbktleSI6IjJkNjZlYzMxLWI5M2ItNDI2ZC1hMzJlLTM0Yjc4OWE4M2E3OCIsInJldmVudWVEYXRlIjoiMjIvMDMvMjAyMCAyOjI0OjM0IFBNIiwic2hpZnQiOiIyIiwic29zSWQiOiIxMjM0NTYiLCJzb2RJZCI6IjY4IiwicGxhemEiOiI4MDMiLCJoYXNEZXBhcnRlZCI6IkZhbHNlIiwianRpIjoiNjhkMDdmNzEtMThiYy00NmQwLTg3YzEtY2MxMjk4YjgxZDkwIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjpbIlVzZXIiLCJBZG1pbiJdLCJleHAiOjE1ODY0MDg1NzUsImlzcyI6Imh0dHA6Ly8xOTIuMTY4LjEuNDo1MDAwIn0.m1mZw79KLIxq4pZPmBRbN7TjILvhvbUIJOCWDEM8I-k

从我们在评论中的对话来看,您似乎从 SharedDataManager.getInstance(context!!).applicationToken 那里得到了 json {"token": "..."}。这解释了为什么当你拆分 : 时你会在日志中打印 "..."}.

在Android中反序列化json的方法有很多种。这里有一些选项。我认为香草方式是这样的:

val root = JSONObject(SharedDataManager.getInstance(context!!).applicationToken)
val token = root.getString("token")

有了这个,您将在 token 中获得令牌。


但是,如果您已有 json 库,则可以使用它。例如,使用 gson 你可以这样做:

data class TokenData(
   @SerializedName("token")
   val token: String)

val token = Gson().fromJson(
           SharedDataManager.getInstance(context!!).applicationToken,
           TokenData::class.java)

您现在可以使用 token


使用 kotlin gen 库 Moshi - com.squareup.moshi:moshi-kotlin-codegen - 你可以像这样定义上面的模型:

@JsonClass(generateAdapter = true)
data class TokenData(
   @Json(name = "token")
   val token: String)

// Then get it like:
val token = Moshi.Builder()
        .build()
        .adapter(TokenData::class.java)
        .fromJson(SharedDataManager.getInstance(context!!).applicationToken)

这些只是一些选项。还有流行的Jackson。选择最适合您需求的那一款。希望这有帮助