2014-09-03 10 views
5

Ich möchte immer einen Parameter zu meinen Retrofit-Aufrufen hinzufügen. Bei Werten, die ich hart Code kann ich einfachRetrofit: Laufzeitparameter zur Schnittstelle hinzufügen?

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

verwenden können, aber was, wenn ich android.os.Build.MODEL angehängt werden soll?

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

funktioniert nicht. Es wäre nützlich, diesen Teil des Netzwerkaufrufs vom Implementierungscode wegzulösen.

EDIT

I unter Verwendung eines RequestInterceptorBuild.MODEL an alle meine api Anrufe hinzufügen können. Wie auch immer, es entgeht mir immer noch, wie ich es selektiv nur zu einigen meiner API-Anrufe hinzufügen kann, während ich immer noch denselben RestAdapter benutze.

EDIT 2

den Titel behoben, der alle Arten von falsch war.

EDIT 3

Aktuelle Umsetzung:

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

Ich benutze derzeit einen 'RequestInterceptor', um den Parameter zu allen API-Aufrufen hinzuzufügen, ignoriert die API dann die zusätzlichen Parameter für die Aufrufe, wo sie nicht benötigt wurden. Das funktioniert, aber macht den Code weniger klar, weil es nicht möglich ist zu bestimmen, welche Anrufe welche Standardparameter benötigen, also lasse ich diese Frage offen. – GDanger

Antwort

7

Build.MODEL ist für die Verwendung in einer Anmerkung nicht verfügbar, da es nicht bei der Kompilierung aufgelöst werden kann. Es ist nur zur Laufzeit verfügbar (weil es von einer Eigenschaft geladen wird).

Es gibt zwei Möglichkeiten, dies zu erreichen. Die erste verwendet eine RequestInterceptor, die Sie in der Frage erwähnen.

Die zweite verwendet einen @Query Parameter für die Methode.

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

Dies erfordert, dass Sie Build.MODEL zu übergeben, wenn die API-Aufruf. Wenn Sie möchten, können Sie die Retrofit-Schnittstelle in eine API einbetten, die für die Anwendungsebene, die dies für Sie übernimmt, benutzerfreundlicher ist.

+0

Gibt es eine Möglichkeit, gezielt darauf zu zielen, welche API die "RequestInterceptor" -Abschnitte aufruft und den Parameter hinzufügt? – GDanger

+0

Nein. Es gilt für alle derzeit verfügbaren Methoden. –

Verwandte Themen