2014-09-03 11 views
5

Vorrei aggiungere sempre un parametro alle mie chiamate Retrofit. Per i valori che posso codificare posso semplicemente utilizzareRetrofit: aggiungi il parametro di runtime all'interfaccia?

@POST("/myApi?myParam=myValue") 

ma cosa succede se voglio aggiungere android.os.Build.MODEL?

@POST("/myApi?machineName="+ Build.MODEL) 

non funziona. Sarebbe utile essere in grado di astrarre questa parte della chiamata di rete dal codice di implementazione.

EDIT

posso aggiungere Build.MODEL a tutti i miei chiamate API utilizzando un RequestInterceptor. Tuttavia mi sfugge ancora come aggiungerlo in modo selettivo a solo alcune delle mie chiamate api mentre utilizzo ancora lo stesso RestAdapter.

EDIT 2

Risolto il titolo che era ogni sorta di male.

EDIT 3

implementazione attuale:

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint("myapi") 
      .setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestInterceptor.RequestFacade request) { 
        request.addQueryParam("machineName", Build.MODEL); 
       } 
      }) 
      .build(); 
    API_SERVICE = restAdapter.create(ApiService.class); 
+0

Attualmente utilizzo un 'RequestInterceptor' per aggiungere il parametro a tutte le chiamate API, quindi l'API ignora i parametri aggiuntivi sulle chiamate in cui non erano necessari. Funziona, ma rende il codice meno chiaro perché non è possibile determinare quali chiamate necessitino di quali parametri predefiniti in modo da lasciare aperta questa domanda. – GDanger

risposta

7

Build.MODEL non è disponibile per l'uso in un'annotazione perché non può essere risolto al momento della compilazione. È disponibile solo in fase di esecuzione (perché viene caricato da una proprietà).

Ci sono due modi per farlo. Il primo sta usando un RequestInterceptor che hai citato nella domanda.

Il secondo utilizza un parametro @Query sul metodo.

@POST("/myApi") 
Response doSomething(@Query("machineName") String machineName); 

Ciò richiede di passare Build.MODEL quando si richiama l'API. Se lo desideri, puoi avvolgere l'interfaccia Retrofit in un'API più amichevole per il livello dell'applicazione che fa questo per te.

+0

C'è un modo per selezionare selettivamente quale api chiama il "RequestInterceptor" intercetta e aggiunge il parametro a? – GDanger

+0

No. Si applica a tutti i metodi al momento. –

Problemi correlati