Nachrüsten: Wie das senden einer POST-Anforderung mit konstant-Felder?
Will ich schickte eine einfache POST-Anfrage mit einer tatsächlichen parameter:
@POST("/token")
@FormUrlEncoded
void extendSession(@Field("refresh_token")final String refreshToken);
Aber diese Forderung sollte auch senden einige Konstante Werte, die vom server angefordert, wie client_id
, client_secret
und grant_type
die konstant und sollte nicht Teil der API.
Was ist der beste Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es egal, Ihr Ansatz. Wenn Sie die Konstanten können Sie erstellen Sie eine Standard-Karte Werte, die für den Anruf.
@FieldMap
geeignet sein für den Aufbau einer Karte mit all Ihren erforderlichen FelderEin bisschen eine alte Frage, aber nachdem Sie darüber nachgedacht, es selbst für eine Weile, das ist, was ich kam mit. Ich würde lieben, zu hören, keinen Gedanken!
Als standard ist, ich habe meine @ - POST-definiert ein interface namens AuthWebservice:
[HINWEIS: ich bin mit Dolch für dependency injection, aber die folgende Logik funktionieren würde, egal wo Sie instanziieren der webservice]
In meiner Ethernet-Karte habe ich die folgenden Informationen, um eine Instanz von AuthWebservice:
Also hier ist meine Lösung:
Außerdem habe ich die folgende Methode definition innerhalb AuthWebservice:
Hinweis: es gibt keine Anmerkungen jeglicher Art, und die Methode gibt den gleichen Datentyp wie die version, die enthält alle die Argumente. Diese wird kompilieren, aber natürlich wird es zur Laufzeit scheitern, wenn Sie versuchen, es zu nennen, etwas wie die folgenden:
Nun habe ich eine Klasse namens
AuthWebserviceWrapper
nimmt eine Instanz vonAuthWebservice
. In den meisten Fällen ist es nur ruft die entsprechende Methode auf der Basis-Instanz, außer für die Methode, die ich gerade oben Hinzugefügt:Und schließlich, wieder in
NetworkModule
ich wrap-Retrofit-Standard-Implementierung zum Beispiel so:Wenn ich jetzt call
refreshToken
ich meine Methode mit default-Werten:Dies gilt natürlich stellen einige vorformulierten, von denen bin ich kein fan, aber ich denke, letztlich ist es der sauberste Weg zu machen, ein webservice-Aufruf, ohne dass die Notwendigkeit für
@Body
oder@FieldMap
.Sowieso, das ist meine Geschichte und ich bleibe dabei.
Können Sie verwenden Java Methode Invocation-Generator für diese.
Und dann Sie rufen die api wie:
@Default
existiert nicht inRetrofit
. Wahrscheinlich ist es eine Anmerkung aus der Bibliothek.Statt einer
String
Ihre Schnittstelle könnte annehmenGrantType
Objekt, das die factory-Methoden für die verschiedenengrant_type
s. Diese factory-Methoden würden dieclient_id
,client_secret
, undgrant_type
Felder.