2017-10-21 144 views
2

接口:在改造基本授权

@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禁止状态码。什么是发送身份验证头的正确方法?

+0

可能令牌已过期 –

回答

1

您在.baseUrl(String.valueOf(R.string.base_url))

是错误的,您应该使用.baseUrl(getActivity().getString(R.string.base_url))

但你的代码将不发送数据到服务器得到的资源字符串和onFailure将被调用。

如果你正确地得到字符串,仍然得到403,你可能想验证你的后端实现使用邮递员。

+0

进行了更改,但仍不起作用。 – Sushil

+0

你是从邮递员那里试过的吗?当你打印'response.raw()'时打印什么? –

+0

'Response {protocol = http/1.0,code = 403,message = Forbidden,url = https://06724330.ngrok.io/burrowedbooks/}' – Sushil

0

你也可以创建一个自定义拦截器来自动添加你的头在新请求上。

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收到令牌良好。你看起来很奇怪,你是怎么看的。