Android应用获取JWT Token时Payload缺失2字符的问题求助
Android中获取JWT Token长度与Postman不一致的排查思路
问题描述
在Android应用中通过POST请求调用API获取JWT Token时,Postman测试返回的Token长度为636字符,但应用内仅能获取到634字符的Token,排查发现差异出在Token的Payload部分,少了2个字符。
相关代码
Retrofit接口定义
@Headers({ "api-key: ....", "Content-Type: application/json" }) @POST("....") Call<JwtTokenResponseModel> getJwtToken(@Body JwtTokenRequestModel body);
Android客户端调用代码
Call<JwtTokenResponseModel> call = apiService.getJwtToken(requestModel); call.enqueue(new Callback<JwtTokenResponseModel>() { @Override public void onResponse(@NonNull Call<JwtTokenResponseModel> call, @NonNull Response<JwtTokenResponseModel> response) { if (response.isSuccessful() && response.body() != null) { jwtToken = response.body(); accessToken = jwtToken.getAccessToken(); Log.i("Info", "onResponse: " + response.code()); Log.i("Info", "onResponse: Expires In : " + jwtToken.getExpiresIn()); Log.i("Info", "onResponse: Token Type : " + jwtToken.getTokenType()); Log.i("Info", "onResponse: Access Token : " + jwtToken.getAccessToken()); Log.i("Info", "onResponse: Access Token's length : " + jwtToken.getAccessToken().length()); Toast.makeText(MainActivity.this, "onResponse: Response successful", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "onResponse: Response not successful or body is null", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<JwtTokenResponseModel> call, Throwable t) { Log.e("Error", "onFailure: " + t.getMessage()); } });
排查思路
- 检查响应模型的字段处理:确认
JwtTokenResponseModel中的accessToken字段定义为String类型,且没有在getter/setter中做trim()或其他截断操作,避免自动去除首尾字符导致长度缩短。 - 对比原始响应内容:给Retrofit添加日志拦截器,打印完整的响应体,和Postman返回的原始响应做对比,确认传输过程中是否出现截断。示例拦截器配置:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build();
将该OkHttpClient传入Retrofit构建器,即可在Logcat中查看完整的响应数据,对比Postman的响应内容是否一致。
- 验证JWT编码/解码逻辑:将Postman和应用中获取的Token拆分出Header、Payload、Signature三部分,分别对比Payload的Base64URL编码字符串。部分Base64库会自动去除末尾的填充字符
=,但标准JWT应保留这些填充位,检查是否是解码后重新编码时丢失了字符。 - 确认请求参数一致性:核对Postman和应用发送的请求Header(如
api-key)、请求体内容是否完全一致,避免服务器因请求差异返回不同的Token。 - 检查Log输出的准确性:Logcat对过长字符串可能存在截断或转义问题,建议将Token写入本地文件后再查看实际长度,而不是仅依赖Log的输出结果。
内容的提问来源于stack exchange,提问作者Issam En-Nasyry
相关产品推荐
相关产品推荐

