当前位置: 首页 > 知识库问答 >
问题:

总是得到401时使用Android设备,但不是在邮递员

元俊雅
2023-03-14

我发送我的代币作为改装的授权,但我总是得到401代码。但是如果我在邮递员中使用相同的令牌,我可以访问。我知道我能够访问webapi,因为我可以很好地登录,并且能够从webapi获取令牌。请参阅下面我的代码:

ApiService接口

@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()
                        }
                    }
                })
            }
        }
    }

### =

2020-04-08 13:03:09.235 14185-14185/com.kotlin.ambulantlcsI/TAG:承载”eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWliOiI4ODgwNSIsInVzZXJZCI6IjEiLCJmaXJzdE5hbWUiOiJKdWFuiwibWlkZGxlTmFtZSI6IkEuiwibGFzdE5hbWUiOiJEZWxhIENydXoiLCJ0cmFuc2FjdGlvbktleSI6IjJkNjZlYzMxLWI5M2ItNDI2ZC1hMzJlLTM0Yjc4OWE4M2E3OCIsInJldmVudWVEYXRlIjoiMjIvMDMjAyMCAyOjI0OjM0IFBNLIWic2

如果我把这个贴在我的邮递员上,我就可以访问

我需要做什么?非常感谢。

共有2个答案

符渊
2023-03-14
Remove "  " quotes from token
make sure that keys must be same
pass token like as:

持票人eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。EYJZDWIJJJZIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJNRPIJOINJHKMDMNZETMTHIYY00NMQWLTG3YZDKWIIAHR0CDOVL3NJAGVTYXMUBLLJCM9ZB2Z0LMNVBS93CY8YMDA4LZA2LKZW50AXR5L2SYWLTCY9YB2XLIPILVZZZZB1BIJDLCJLEHAIOJE1ODY0MDG1NZCUSIMILZCYI6IMH6D6D6Y8Y2LZ2LKZW50AXR5L2SYWLTCYB2YB2LIJ2BLIZGB1BIJDLCJLEJAIZHAIOJEZJAI0DJAI0DZY6Y6Y。m1mZw79KLIxq4pZPmBRbN7TjILvhvbUIJOCWDEM8I-k

翁良弼
2023-03-14

从我们在评论中的对话中,您似乎得到了一个json{"Token":"..."}fromSharedDataManager.getInstance(上下文!!)。应用令牌。这解释了为什么当您在中拆分时:会打印在日志"..."}中。

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

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

这样,您就可以在令牌中获得令牌。

但是,如果您已经有一个json库,您可以使用它。例如,使用gson,您可以执行以下操作:

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

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

您现在可以使用令牌。

与Moshi一起使用kotlin gen库-com。收拾一下。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)

这些只是一些选择。还有流行歌手杰克逊。挑一个最适合你需要的。希望这有帮助

 类似资料:
  • 我的物理设备是华为LUA-22,Android 5.1。android工作室看不到那部手机,但ADB看到了。启用了Usb调试。尝试将MTP更改为PTP,但不起作用。

  • 我刚刚开始了解Android中的s。 当您创建一个新的空白项目时,默认情况下还包括一个,尽管它并没有真正被使用。我的印象是,谷歌希望你一直使用s,无论应用程序多么简单。这是一个真实的评估,还是你能想出不使用s的理由? 我还觉得奇怪的是,留档表明也可以用于与UI无关的内容。你能给我一个应用程序的例子,它将使用,但不提供任何UI?

  • 那还行。然后尝试调用创建用户(或执行其他操作),得到一个401未经授权的错误: 这不是包含令牌的正确方式吗?访问令牌是用于验证其他API调用的令牌吗?管理员帐户的令牌难道不应该用于通过主域对其他客户机的调用进行身份验证吗?是否需要在管理控制台更改主域中的某些设置?任何帮助都很感激。

  • 我使用的是Android Studio 0.8.9。问题是,它没有检测到我的设备。我用几种不同的设备试过了。命令行上的“adb设备”显示设备。命令行上的adb logcat工作正常。DDMS视图(Android设备监视器)识别设备并显示logcat!但是Android Studio外壳没有显示它。我智穷极了。我已经尝试重新启动过程中涉及的一切-Android Studio、adb、我的手机,甚至我

  • 上面的代码在桌面JVM上工作,发送一个帖子请求,在服务器端成功解析,响应200,但是在Android系统上,请求方法保持GET(是的,我检查了它是假的),并导致404异常。官方文档表示,将doOutput设置为true会触发将请求方法设置为POST,但情况似乎并非如此。

  • JAVAlang.NoSuchMethodError:kotlinx。协同程序。频道。LinkedListChannel:未找到方法()V 这是我的数据库。千吨级 私有val客户端=KMongo.create客户端()。协程 私有val数据库=client.get数据库("PestaDanDagangDatabase") 私有val用户=database.getCollection() 私有val