【问题标题】:Error 401 from retrofit even after setting the Authorization Token即使在设置了授权令牌后,也出现了来自改造的错误 401
【发布时间】:2019-11-04 07:29:41
【问题描述】:

尝试使用@POST 访问api,我已经设置了@Header("Authorization") String TOKEN

我已经用@GET 尝试过,它有效,但我传递了一些表单字段,所以我需要使用@POST

@POST("details")
@FormUrlEncoded
Call<Play> playTrack(
        @Header("Authorization") String TOKEN,
        @Field("event_id") int event_id,
        @Field("longitude") double longitude,
        @Field("latitude") double latitude    
);

【问题讨论】:

  • 你的授权令牌类型是什么,是承载者吗?
  • 错误 401 表示未经授权的错误。检查您是否传递了正确的授权凭据
  • @Md.Asaduzzaman 是的
  • 然后不要忘记将 Bearer 作为前缀添加到您的令牌中。 "Bearer "+ token

标签: android authorization retrofit


【解决方案1】:

尝试创建一个 header 拦截器并将其添加到 OkHttpClient :

Interceptor headerIntercepter  = new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {

      return chain.proceed(    chain.request().newBuilder().addHeader("authorization- 
client", accessToken).build());

        }
    };

OkHttpClient client = new OkHttpClient.Builder().connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
            .addInterceptor(headerIntercepter)
            .build();

    try {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Server_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        apiService = retrofit.create(Api.class);

【讨论】:

  • 我试过这个。它没有用。但是对于我的@GET 注释。有效。所以问题不在于令牌。
  • 是的,我知道,我的意思是你可以像这样在拦截器中添加标题 return chain.proceed(chain.request().newBuilder().addHeader("Authorization", accessToken).build ());
  • 是的,我明白了。我什至在发帖之前尝试过。谢谢
  • 任何解决方案。我也面临同样的情况
【解决方案2】:

尝试在注释上使用 Multipart

@Multipart
@POST("details")
Call<ResponseBody> playTrack(
    @Header("Authorization") String token,
    @Part("event_id") RequestBody eventId,
    @Part("longitude") RequestBody longitude,
    @Part("latitude") RequestBody latitude,
);

确保将 RequestBody 作为参数传递

val latitude = RequestBody.create(MediaType.parse("text/plain"), doubleLatitude.toString())

【讨论】:

    【解决方案3】:

    看到 401 响应意味着请求已成功执行 并且服务器返回了该状态码。这不是问题 改造,但在您包含的任何身份验证信息中 在服务器期望的请求中。

    用相同数据的邮递员尝试并检查

    注意:不要忘记添加 Token Type 作为令牌的前缀

    【讨论】:

    • 是的。已添加
    猜你喜欢
    • 2021-01-27
    • 2016-01-30
    • 2021-11-25
    • 2016-03-25
    • 2016-07-02
    • 2020-03-01
    • 2019-10-26
    • 2019-09-19
    • 2013-04-25
    相关资源
    最近更新 更多