2017-07-19 2 views
3

J'ai mis en retrofit avec l'authentification de base, j'envoie la @header sur ma demande de connexion, mais quand je l'appelle une demande authentifiée, il me retourne 401 (Non authorizated).Rénovation + authentification de base

Comment je l'implémente générique? Ou dois-je toujours appeler mes demandes authentifiées avec @header?

@GET("user") 
Call<User> getUserByEmail(@Query("email") String email, @Header("Authorization") String authorization); 

Quand j'appelle Get utilisateur par courrier électronique (I authentifier l'utilisateur) ...

@PUT("usuario/{userId}/") 
Call<User> putUserById(@Path("userId") Integer id, @Body User user); 

Quand je Mettre un appel utilisateur (je dois faire une demande authentifiée).

Ma classe de rénovation ...

public class NetworkService { 
private NetworkAPI networkAPI; 
private OkHttpClient okHttpClient; 

public NetworkService() { 
    okHttpClient = buildClient(); 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BuildConfig.HOST) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(okHttpClient) 
      .build(); 

    networkAPI = retrofit.create(NetworkAPI.class); 
} 

public NetworkAPI getAPI() { 
    return networkAPI; 
} 

private OkHttpClient buildClient() { 

    OkHttpClient.Builder builder = new OkHttpClient.Builder(); 

    builder.addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 

      return response; 
     } 
    }); 

    builder.addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      //this is where we will add whatever we want to our request headers. 
      Request request = chain.request().newBuilder() 
        .addHeader("Accept", "application/json") 
        .addHeader("Content-Type", "application/json") 
        .build(); 
      return chain.proceed(request); 
     } 
    }); 

    return builder.build(); 
} 
} 

quelqu'un peut me aider?

+0

* Ou dois-je toujours appeler mes demandes authentifiées avec @header? * Cela dépend de la façon dont vous avez implémenté auth sur votre serveur et de la façon dont vous identifiez les demandes/appareils –

+0

Pouvez-vous me montrer un exemple pour le rendre générique? –

+0

Vous pouvez ajouter des en-têtes à la demande de RequestInterceptor et ajouter cet intercepteur à votre RestAdapter. Et pour chaque demande, utilisez cet adaptateur de repos, afin que vous n'ayez pas besoin d'ajouter un en-tête à chaque fois. – rushi

Répondre

1

utilisation @Header ("Autorisation") Autorisation de chaîne dans NetworkService

Request request = chain.request().newBuilder() 
        .addHeader("Accept", "application/json") 
        .addHeader("Content-Type", "application/json") 
        .addHeader("Authorization", "AuthorizationValue") 
        .build(); 
+0

vous pouvez simplement vérifier if (islogin) {. AddHeader ("Authorization", "AuthorizationValue")} –

+0

Je dois enregistrer les informations sur ma classe d'application? –

+0

vous pouvez utiliser la préférence partagée pour sauvegarder et charger –

0

Si vous utilisez Retrofit 2 et voici un échantillon pour une authentification de base en-têtes

public interface SomeApi { 
@Headers({ 
    "Content-Type: application/json", 
    "Authorization: Basic KzY1OTY0MjA4NTQ6MTExMTE=" 
}) 
@POST("test/someService") 
Completable getTrips(); 

}