private void setUpRestClient() {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/pyur.v1")
.header("Authorization", new SharedPreferencesUtil(getBaseContext()).getToken())
.header("Content-Type", "application/json")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
});
RestClient.getInstance().configureRestAdapter(this, getResources().getString(R.string.base_url),client);
}
public void configureRestAdapter(final Context context, String baseUrl, OkHttpClient client) {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
service = retrofit.create(NetworkServiceInterface.class);
}
これにより、Retrofit 2.0で失敗が返されるようになりました。元々は「Authorization」ヘッダーがなく、無許可でした。これは理解できることです。しかし、今は認証トークンで認証していますが、失敗します。 Retrofit 2.0の新機能、ありがとう-
承認ヘッダーを次のように渡すことができます。
@GET("/v1/OrderReport.json")
Call<POJO_Class> getExampleMethod(@Header("Authorization") String token, @Query("id") String id);
次に、次のように呼び出します。
getExampleMethod("Basic " + token, id);
OkHttpClient.Builderクラスを使用して、Retrofit2のInterceptorを使用してすべての呼び出しに認証ヘッダーを追加できます。このような。
import okhttp3.OkHttpClient;
import okhttp3.Interceptor;
OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
//getAccessToken is your own accessToken(retrieve it by saving in shared preference or any other option )
if(getAccessToken().isEmpty()){
PrintLog.error("retrofit 2","Authorization header is already present or token is empty....");
return chain.proceed(chain.request());
}
Request authorisedRequest = chain.request().newBuilder()
.addHeader("Authorization", getAccessToken()).build();
PrintLog.error("retrofit 2","Authorization header is added to the url....");
return chain.proceed(authorisedRequest);
}}).build();
そして、このクライアントオブジェクトをretrofitオブジェクトに追加します。
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL) //BaseURL always ends with "/"
.addConverterFactory(GsonConverterFactory.create())
.client(defaultHttpClient)
.build();
これで、retrofitオブジェクトを使用して行うすべての呼び出しに対して、URLとともに「Authorization」ヘッダーが追加されます。また、認証値が空の場合、リクエスト呼び出しのAuthorizationヘッダー部分を単に省略するという条件も処理します。
レトロフィット:2.0より
追加するにはOkHttpClient.Builder()クラスを使用する必要がありますInterceptors。
したがって、このようにコードを変更する必要があります。
OkHttpClient client = new OkHttpClient.Builder();
client.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/pyur.v1")
.header("Authorization", new SharedPreferencesUtil(getBaseContext()).getToken())
.header("Content-Type", "application/json")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
}).build();