2014-11-02 6 views
8

Ich möchte eine einfache POST-Anforderung mit einem aktuellen Parameter verschickt an:Retrofit: Wie senden Sie eine POST-Anfrage mit konstanten Feldern?

@POST("/token") 
@FormUrlEncoded 
void extendSession(@Field("refresh_token")final String refreshToken); 

Aber diese Anfrage auch einige konstante Werte vom Server wie client_id, client_secret und grant_type die Teil angefordert senden sollte konstant sind und sollte nicht sein der Anwendungs-API.

Was ist der beste Weg, dies zu tun?

Antwort

8

Es ist Ihre Sache. Wenn Sie die Konstanten haben, können Sie eine Standardkarte von Werten erstellen, die für Ihren Aufruf benötigt werden. @FieldMap wird für den Aufbau einer Karte mit allen erforderlichen Felder

private void extendSession(String token){ 
    Map params = buildDefaultParams(); 
    params.put("refreshToken", token); 
    getRestAdapter().create(MyApi.class).extendsSession(params); 
} 
private Map buildDefaultParams(){ 
    Map defaults = new HashMap(); 
    defaults.put("client_id", CLIENT_ID); 
    defaults.put("client_secret", CLIENT_SECRET); 
    defaults.put("grant_type", GRANT_TYPE); 
    return defaults; 
} 
    /**then you change your interface to this **/ 
    @POST("/token") 
    @FormUrlEncoded 
    void extendSession(@FieldMap() Map refreshToken); 
+3

Dies ist, was ich getan habe, obwohl es keine "elegante" Lösung ist. –

+1

Es gibt ein ausstehendes Problem auf Github, und ich habe diesen Beitrag auch dort verlinkt. https://github.com/square/retrofit/issues/951 –

1

Sie verwenden können Java Method Invocation Builder dafür geeignet sein.

@GenerateMethodInvocationBuilder 
public interface ServiceApi { 
@POST("/token") 
@FormUrlEncoded 
void extendSession(
    @Default("theToken") @Field("refresh_token") final String refreshToken, 
    @Default("theId") @Field("client_id") final String clientId, 
    @Default("theSecret") @Field("client_secret") final String clientSecret, 
    @Default("theType") @Field("grant_type") final String grantType); 
} 

Und dann können Sie die api aufrufen wie:

ServiceApiExtendedSessionBuilder.extendedSession() 
.withRefreshToken("theRefreshToken") 
.invoke(serviceApi); 
0

Statt eines String könnte Ihre Schnittstelle ein GrantType Objekt übernehmen, die für verschiedene grant_type s Factory-Methoden hat. Diese Fabrikmethoden würden die Felder client_id, client_secret und grant_type festlegen.

@POST("/oauth/token") 
Call<Token> extendSession(@Body GrantType grantType); 
Verwandte Themen