Retrofit: как отправить запрос POST с постоянными полями?

Я хочу отправить простой запрос POST с одним фактическим параметром:

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

но этот запрос также должен отправлять некоторые постоянные значения, запрошенные сервером, такие как client_id, client_secret и grant_type, которые являются постоянными и не должны быть частью API приложения.

каков наилучший способ сделать это?

3 ответов


Это вопрос вашего подхода. Если у вас есть константы, вы можете создать карту значений по умолчанию, необходимых для вашего вызова. @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);

Вы можете использовать Java Метод Вызова 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);

вместо String, ваш интерфейс может принимать GrantType объект, который имеет заводские методы для различных grant_types. Эти заводские методы установят client_id, client_secret и grant_type поля.

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