在改造基本授权
问题描述:
接口:在改造基本授权
@GET("burrowedbooks/")
Call<JsonArray> getCategoryList(@Header("Authorization") String token);
用法:
private LibraryAPi service;
Retrofit retrofit = new Retrofit.Builder()
//.client(client)
.baseUrl(String.valueOf(R.string.base_url))
.addConverterFactory(GsonConverterFactory.create())
.build();
service = retrofit.create(LibraryAPi.class);
// Extract token from Shared Preferences.
SharedPreferences prefs = getActivity().getSharedPreferences(getString(R.string.login_data), MODE_PRIVATE);
String token = "Bearer "+prefs.getString("token","");
Call<JsonArray> categoryListResponseCall = service.getCategoryList(token);
categoryListResponseCall.enqueue(new Callback<JsonArray>() {
@Override
public void onResponse(Call<JsonArray> call, Response<JsonArray> response) {
int statusCode = response.code();
Toast.makeText(getContext(), ""+statusCode, Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<JsonArray> call, Throwable t) {
}
});
我想送存储在共享偏好身份验证令牌。上面的代码不起作用。它返回403禁止状态码。什么是发送身份验证头的正确方法?
答
您在.baseUrl(String.valueOf(R.string.base_url))
是错误的,您应该使用.baseUrl(getActivity().getString(R.string.base_url))
但你的代码将不发送数据到服务器得到的资源字符串和onFailure
将被调用。
如果你正确地得到字符串,仍然得到403,你可能想验证你的后端实现使用邮递员。
答
你也可以创建一个自定义拦截器来自动添加你的头在新请求上。
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Authorization", token)
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
}
OkHttpClient client = httpClient.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
此外,检查是否从SharedPreferences
收到令牌良好。你看起来很奇怪,你是怎么看的。
可能令牌已过期 –