在Retrofit请求中添加头信息

9

我有一个令牌,我将其保存到sharedPreferences中,然后获取该令牌并将其作为授权传递给Retrofit请求。下面是我用于向我的retrofit请求添加标题的代码。

我需要添加以下标题: "Authorization" "Bearer" + token

public static Retrofit getClient(String token) {

    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient okClient = new OkHttpClient();

    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();

    okClient.interceptors().add(chain -> {
        Response response = chain.proceed(chain.request());
        return response;
    });

    okClient.interceptors().add(chain -> {
        Request original = chain.request();
        Request request = original.newBuilder()
                .header("Authorization", token)
                .method(original.method(), original.body())
                .build();

        return chain.proceed(request);
    });

    okClient.interceptors().add(logging);

    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(Config.BASE_URL1)
                .client(okClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
    return retrofit;
}

这是我将令牌发送给Retrofit客户端的方式。
 Retrofit retrofit = RetrofitClient.getClient("Bearer" + " " +       authUser.getToken());
 APIService mAPIService = retrofit.create(APIService.class);

但是不幸的是,服务器返回了无授权的信息。

3个回答

13

您可以在不使用拦截器的情况下向服务器发送标题。只需在服务接口中的方法声明中添加一个字段,如下所示:

@GET("my/orders/{id}")
Call<Order> getOrder(@Header("Authorization") String token,
                     @Path("id") int order_id);

然后创建一个Call对象,以以下方式发送请求:

APIService apiService= retrofit.create(APIService.class);
Call<Order> call = apiService.getOrder(token, id);
call.enqueue(/*callback*/);

如果您想为每个请求添加相同的授权标头,该怎么办? - Swaminath Bera

1
在BaseCaller类中添加一个关于headers的方法,如下所示:
public HashMap<String, String> getHeaders() {
        HashMap<String, String> headerHashMap = new HashMap<>();
        headerHashMap.put("Content-Type", "application/x-www-form-urlencoded");
        headerHashMap.put("time_zone_name", DateTimeHelper.getTimeZoneName());
        headerHashMap.put("gmt_offset", DateTimeHelper.getGMTOffset());
        return headerHashMap;
    }

现在在您的服务类中创建一个与url相关的方法,如下所示:
@FormUrlEncoded
    @POST("switch_user")
    Call<JsonObject> switchUser(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> fields);

最后,在您的调用类中按以下方式调用方法:
call = loginService.switchUser(getHeaders(), apiParams.mHashMap);

这将做所需的事情 :)

1

可以试试这个:

String credentials = "put your token here";
final String basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
Request.Builder requestBuilder = original.newBuilder()
                                         .header("Authorization",basic);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接