2014-11-02 68 views
8

我想發送一個簡單的POST請求與一個實際參數:改造:如何發送帶有常量字段的POST請求?

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

但這一要求也應該向服務器請求某個常數的值,如client_idclient_secretgrant_type這是不變的,不應該是一部分的應用程序API。

這樣做的最好方法是什麼?

回答

8

這是你的方法問題。如果你有常量,你可以爲你的調用建立一個默認的地圖值。 @FieldMap將適用於構建地圖與您的所有必填字段

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

這就是我最終做的,雖然它不是一個「優雅」的解決方案。 – 2015-01-01 07:27:01

+1

Github上有一個懸而未決的問題,我也將這個帖子鏈接到那裏。 https://github.com/square/retrofit/issues/951 – 2015-07-28 23:45:17

1

您可以使用Java Method Invocation Builder這一點。

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

然後你就可以調用,如API:

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

取而代之的是String,你的界面可以接受一個GrantType對象,它有不同的grant_type工廠方法。這些工廠方法將設置client_id,client_secretgrant_type字段。

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