2017-07-19 3 views
3

Ich habe Retrofit mit Basisauthentifizierung implementiert, ich sende die @ header auf meine Login-Anfrage, aber wenn ich einige authentifizierte Anfrage aufrufen, gibt es mir 401 (nicht autorisiert).Retrofit + Standard-Authentifizierung

Wie implementiere ich es generisch? Oder muss ich meine authentifizierten Anfragen immer mit @header aufrufen?

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

Wenn ich Benutzer von E-Mail, rufen Sie (ich den Benutzer authentifizieren) ...

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

Wenn ich Benutzer Put Call (ich brauche eine authentifizierte Anforderung zu machen).

Meine Retrofit-Klasse ...

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(); 
} 
} 

Kann mir jemand helfen?

+0

* Oder ich muss immer meine authentifizierten Anfragen mit @header? * Aufrufen, das hängt davon ab, wie Sie auth auf Ihrem Server implementiert haben und wie Sie Anfragen/Geräte identifizieren. –

+0

Können Sie mir einen zeigen? Beispiel, um es generisch zu machen? –

+0

Sie können Header in Anforderung von RequestInterceptor hinzufügen und diesen Interceptor zu Ihrem RestAdapter hinzufügen. Und für jede Anfrage benutzen Sie diesen Restadapter, damit Sie nicht jedes Mal Header hinzufügen müssen. – rushi

Antwort

1

Verwendung @Header ("Authorization") String Berechtigung in NetworkService-

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

Sie können einfach überprüfen, ob (islogin) {. AddHeader ("Authorization", "AuthorizationValue")} –

+0

Ich muss die Informationen in meiner Application-Klasse speichern? –

+0

können Sie gemeinsame Einstellungen zum Speichern und Laden verwenden –

0

Wenn Sie Retrofit 2 und hier eine Probe für einige grundlegende Authentifizierung in Header ist

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

}

Verwandte Themen