2014-11-02 21 views
8

:Retrofit: Sabit alanlar ile bir POST isteği nasıl gönderilir? Bir gerçek parametre ile basit bir POST isteği gönderdi istiyorum

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

Ama aynı zamanda sunucu tarafından talep edilen bazı sabit değerler göndermesi gerektiğini bu istek gibi client_id, client_secret ve sabittir ve yer almamalıdır grant_type uygulama API'sı.

Bunu yapmanın en iyi yolu nedir?

cevap

8

Bu sizin yaklaşımınızın konusudur. Eğer sabitleriniz varsa, aramanız için gereken varsayılan bir Harita Haritası oluşturabilirsiniz. @FieldMap Bunun için Java Method Invocation Builder kullanabilir tüm gerekli alanları

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

Bu, "zarif" bir çözüm olmasa da işim bittiği şeydir. –

+1

Github'da bekleyen bir sorun var ve bu gönderiyi de buraya bağladım. https://github.com/square/retrofit/issues/951 –

1

ile Harita bina için uygun olacaktır.

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

Sonra gibi api çağırabileceği:

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

yerine bir String, arayüz farklı grant_type s için fabrika yöntemleri vardır bir GrantType nesneyi kabul başladı. Bu fabrika yöntemleri, client_id, client_secret ve grant_type alanlarını ayarlar.

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