2016-06-16 2 views
0

Я пытаюсь создать экземпляр singleton для Retrofit2, который отлично работает. Но как только я хочу динамический заголовок, я не могу этого сделать.Retrofit2 singleton Экземпляр

public class ApiManager { 


    public final static String BASE_URL = "URL"; 



    private static ApiManager instance =null; 
    private ApiModule apiModule; 

    public interface ApiModule { 


     @GET("exists") 
     Call<ServerStatus> checkExistsTeamName(@Path("teamName") String teamName); 


    } 


    private ApiManager(){ 
     final TimeZone tz = TimeZone.getDefault(); 
     OkHttpClient client = new OkHttpClient(); 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     try { 
      client.interceptors().add(new Interceptor() { 
       @Override 
       public com.squareup.okhttp.Response intercept(Interceptor.Chain chain) throws 
         IOException { 

        Request original = chain.request(); 
        Request request = original.newBuilder() 
          .header("X-API-Version", "1") 
          .header("X-USER-TIMEZONE", tz.getID()) 
          .method(original.method(), original.body()) 
          .build(); 


        return chain.proceed(request); 

       } 
      }); 
     }catch (Exception e){ 

     } 
     client.interceptors().add(interceptor); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 

     apiModule = retrofit.create(ApiModule.class); 
    } 





    public static ApiManager getInstance() { 
     if(instance == null) { 
      instance = new ApiManager(); 
     } 
     return instance; 
    } 




    public ApiModule getService() { 
     return apiModule; 
    } 

    public ApiModule getService(String token){ 
     return apiModule; 
    } 




} 

И в другой деятельности я могу получить звонок для модернизации как.

ApiManager apiManager = ApiManager.getInstance(); apiManager.getService(). CheckExistsTeamName ("parameters")

Что работает отлично здесь. Но хочу, если я хочу добавить дополнительные дополнительные динамические заголовки, как мне это сделать? Я застрял здесь

+0

Что вы подразумеваете под добавлением дополнительных динамических заголовков? Вы хотите добавить их в код 'original.newBuilder()'? – ishmaelMakitla

+0

Вы имеете в виду, добавляя дополнительные заголовки к определенному вызову API? – Emma

+0

Да, я хочу добавить дополнительные заголовки к конкретному APi Call @Emm – Sutirth

ответ

1

Вам нужна какая-то инъекция зависимости. Попробуйте этот код. Прежде чем звонить вам, позвоните по телефону

ApiManager.setHeaders(map of headers); 

с заголовком. Вызовите с пустой картой или null, чтобы исключить их.

public class ApiManager { 


public final static String BASE_URL = "URL"; 



private static ApiManager instance =null; 
private ApiModule apiModule; 

public interface ApiModule { 


    @GET("exists") 
    Call<ServerStatus> checkExistsTeamName(@Path("teamName") String teamName); 


} 

private static Map<String, String> headers = new HashMap<>(); 

public static void setHeaders(Map<String, String> headers) { 
    ApiManager.headers = headers; 
} 

private ApiManager(){ 
    final TimeZone tz = TimeZone.getDefault(); 
    OkHttpClient client = new OkHttpClient(); 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    try { 
     client.interceptors().add(new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws 
        IOException { 

       Request original = chain.request(); 
       Request.Builder builder = original.newBuilder() 
         .header("X-API-Version", "1") 
         .header("X-USER-TIMEZONE", tz.getID()) 
         .method(original.method(), original.body()); 

       if(headers != null) { 
        for (Map.Entry<String, String> entry : headers.entrySet()) { 
         builder.header(entry.getKey(), entry.getValue()); 
        } 
       } 

       Request request = builder.build(); 

       return chain.proceed(request); 

      } 
     }); 
    }catch (Exception e){ 

    } 
    client.interceptors().add(interceptor); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(client) 
      .build(); 

    apiModule = retrofit.create(ApiModule.class); 
} 





public static ApiManager getInstance() { 
    if(instance == null) { 
     instance = new ApiManager(); 
    } 
    return instance; 
} 




public ApiModule getService() { 
    return apiModule; 
} 

public ApiModule getService(String token){ 
    return apiModule; 
} 

}

+0

, но должен ли я иметь любую функцию заголовка @svatOpluk ?? – Sutirth

+0

Пробовал свой путь, но он не работает для меня, и приложение аварийно завершает работу – Sutirth

0

В соответствии с модифицированной documentation, если вы хотите добавить заголовки к конкретным запросам, вы можете сделать так, как показано ниже.

Вы можете установить статические заголовки для метода, используя аннотацию @Headers.

@Headers("Cache-Control: max-age=640000") 
@GET("widget/list") 
Call<List<Widget>> widgetList(); 

@Headers({ 
    "Accept: application/vnd.github.v3.full+json", 
    "User-Agent: Retrofit-Sample-App" 
}) 
@GET("users/{username}") 
Call<User> getUser(@Path("username") String username); 

Обратите внимание, что заголовки не перезаписывают друг друга. Все заголовки с одинаковым именем будут включены в запрос.

Заголовок запроса можно обновлять динамически, используя аннотацию @Header . Соответствующий параметр должен быть предоставлен в @Header. Если значение равно null, заголовок будет опущен. В противном случае toString будет вызываться по значению и использованному результату.

@GET("user") 
Call<User> getUser(@Header("Authorization") String authorization) 

Заголовки, которые должны быть добавлены к каждому запросу могут быть указаны с помощью OkHttp interceptor.

+1

FYI, начиная с 2.1.0 Добавлена ​​аннотация заголовка, если у нас есть несколько параметров динамического заголовка. https://github.com/square/retrofit/blob/master/CHANGELOG.md#version-210-2016-06-15 – Emma

+1

@ Jickson, @ Emma Это не решает цель, которую я должен написать заголовок в каждом запросе Это утомительно, и я думаю, что это не так. – Sutirth

+0

Вы должны использовать перехватчик OkHttp, если хотите использовать одни и те же заголовки для нескольких запросов. Обратитесь к этому https://futurestud.io/blog/retrofit-add-custom-request-header – Jickson

Смежные вопросы