web-dev-qa-db-ja.com

Retrofit2.0ヘッダー認証

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の新機能、ありがとう-

7
Cannon Collins

承認ヘッダーを次のように渡すことができます。

@GET("/v1/OrderReport.json")
Call<POJO_Class> getExampleMethod(@Header("Authorization") String token, @Query("id") String id);

次に、次のように呼び出します。

getExampleMethod("Basic " + token, id);
16
Vishal Raj

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ヘッダー部分を単に省略するという条件も処理します。

8
Stephenraj

レトロフィット: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();
5
Stephenraj