2014-11-02 26 views
8

Voglio inviato una semplice richiesta POST con un parametro effettivo:Retrofit: come inviare una richiesta POST con campi costanti?

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

Ma questa richiesta dovrebbe anche inviare alcuni valori costanti richiesti dal server, come client_id, client_secret e grant_type che sono costanti e non deve essere parte dell'API dell'applicazione.

Qual è il modo migliore per farlo?

risposta

8

È una questione di approccio. Se hai le costanti puoi costruire una mappa di valori predefinita richiesta per la tua chiamata. @FieldMap sarà adatto per la costruzione di una mappa con tutti i campi obbligatori

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

Questo è quello che ho finito, anche se non è una soluzione "elegante". –

+1

C'è un problema in sospeso su Github e anch'io ho collegato questo post. https://github.com/square/retrofit/issues/951 –

1

Si può utilizzare Java Method Invocation Builder per questo.

@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); 
} 

E poi è possibile richiamare l'API come:

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

Invece di un String, l'interfaccia potrebbe accettare un oggetto GrantType che ha metodi di fabbrica per i diversi grant_type s. Questi metodi di fabbrica impostano i campi client_id, client_secret e grant_type.

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