2013-07-10 8 views
26

Ich verwende die Retrofit-Bibliothek von Square für kurzlebige Netzwerkanrufe. Es gibt ein paar Daten, die ich bei jeder Anfrage als @Query params. Wie so:Gibt es eine Möglichkeit, einen Basisanforderungs-Parameter festzulegen, der in jede mit der Retrofit-Bibliothek von Square erstellte Anfrage aufgenommen wird?

@GET("/thingOne.php") 
void thingOne(
     @Query("app_version") String appVersion, 
     @Query("device_type") String deviceType, 
     Callback<Map<String,Object>> callback 
); 

@GET("/thingTwo.php") 
void thingTwo(
     @Query("app_version") String appVersion, 
     @Query("device_type") String deviceType, 
     Callback<Map<String,Object>> callback 
); 

Es ist umständlich zu haben appVersion und deviceType für jeden einzelnen Endpunkt in den Interface skizzierte zu definieren. Gibt es eine Möglichkeit, einen Basissatz von Parametern festzulegen, der bei jeder Anfrage enthalten sein sollte? Etwas ähnliches wie wir einen gemeinsamen Authorization Header setzen?

RestAdapter restAdapter = new RestAdapter.Builder() 
    .setServer("...") 
    .setRequestHeaders(new RequestHeaders() { 
     @Override 
     public List<Header> get() { 
      List<Header> headers = new ArrayList<Header>(); 
       Header authHeader = new Header(
        "Authorization", "Bearer " + token); 
       headers.add(authHeader); 
      } 
      return headers; 
     } 
    }) 
    .build(); 
this.service = restAdapter.create(ClientInterface.class); 

Antwort

54

Sie können alle Anforderungen gewährleisten haben diese Abfrageparameter durch eine benutzerdefinierte RequestInterceptor zu Ihrem RestAdapter Zugabe

RequestInterceptor requestInterceptor = new RequestInterceptor() 
{ 
    @Override 
    public void intercept(RequestFacade request) { 
     request.addQueryParam("app_version", "Version 1.x"); 
     request.addQueryParam("device_type", "Samsung S4"); 
    } 
}; 

restAdapter.setRequestInterceptor(requestInterceptor) 
+1

ist [diese] (http://developer.android.com/reference/org/apache /http/HttpRequestInterceptor.html) wovon redest du? Ich kann anscheinend keinen Hinweis auf eine Klasse mit dem Namen RequestInterceptor finden. Oder zu RequestFacade. Und RestAdapter hat keine Methode 'setRequestInterceptor'. Können Sie bitte weitere Einzelheiten angeben? –

+0

Sie müssen eine ältere Version von Retrofit haben. Wenn Sie es auf Version 1.1.1 aktualisieren, sollten Sie sie sehen. http://square.github.io/retrofit/javadoc/retrofit/RequestInterceptor.html – Erich

+1

@ kdubb: Wie mache ich das für Body? Ich habe einen POST, der eine Json-Payload akzeptiert. Vielen Dank! – dannyroa