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_type
s. Эти заводские методы установят client_id
, client_secret
и grant_type
поля.
@POST("/oauth/token")
Call<Token> extendSession(@Body GrantType grantType);