Dans ma configuration, tous les chemins d'accès de mes ressources sont obtenus à partir de l'API REST à partir d'un appel initial à l'API. Nous utilisons ce modèle pour pouvoir modifier tous les chemins de ressources sans détruire toutes les versions d'applications existantes dans le processus.
J'ai joué avec Retrofit et j'ai essayé de créer une méthode qui accepterait n'importe quel chemin que je lui transmettrais sous forme de chaîne. Mon essai ressemble à ceci
@GET("/{path}")
public FooBar getFooBar(@Path("path") String path);
J'essaie ensuite de l'appeler comme suit.
String path = "foo/bar";
api.getFooBar(path);
Malheureusement, Retrofit URL-Encode le remplacement du chemin et je finis par faire une demande à /foo%2Fbar
au lieu de /foo/bar
. Existe-t-il un moyen de désactiver le codage d'URL pour les remplacements de chemin ou d'effectuer des remplacements couvrant plusieurs segments de chemin? Malheureusement, je ne sais même pas combien de segments de chemin il y a, tout est contrôlé par l'API.
Utilisez @EncodedPath
! C'est tout. Je vais copier le Javadoc afin que cette réponse a plus de viande:
Remplacement nommé dans le chemin de l'URL. Les valeurs sont converties en chaîne à l'aide de
String.valueOf(Object)
. Les valeurs sont utilisées littéralement sans codage d'URL. Voir@Path
pour l'équivalent de codage d'URL.
Utilisez-le comme ceci:
@GET("/{path}") void example(@EncodedPath("path") String path, ..);
Puisque @EncodedPath est obsolète maintenant
Retrofit 1.9:
@GET("/{path}")
void example(@Path(value = "path", encoded = false) String path, ..);
Retrofit 2. *:
@GET("/{path}")
void example(@Path(value = "path", encoded = false) String path, ..);
Il y a des bugs connus, et vous pouvez regarder le rapport de bugs sur: Retrofit @Github
Il existe également un lien vers les solutions possibles: Solution @Github
En fin de compte, le message des développeurs de la modernisation est le suivant:
"Les remplacements de chemin couvrant plusieurs segments de chemin ne seront pas pris en charge. Vous devez utiliser @Url pour créer l'URL relative complète par programme si le nombre de segments de chemin varie de manière dynamique."
Donc, si vous avez des problèmes d’encodage, la solution peut être:
Votre API pour GET:
@GET
Call<Object> Function(@Url String path, @Query("CONTENT") String content);
Votre API pour POST:
@FormUrlEncoded
@POST
Call<Object> Function(@Url String path, @Field("CONTENT") String content);
Et vous pouvez l'appeler avec ceci:
String thePath = "www.foo.de/foo/foo2";
Call<Object> call = api.Function(thePath,content);
Donc, avec cela, vous n'avez pas le problème d'encoder quelque chose.
Mais si vous recherchez simplement l'encodage normal dans la version 2. *, l'API doit ressembler à ceci:
@GET("/{path}")
void example(@Path(value = "path", encoded = false) String path, ..);
Cordialement
Je fais face au même problème et le résous comme ci-dessous code
@POST(ApiKey.URL.add_edit_notice + "{id}")
@FormUrlEncoded
Call<GenericResponse> callAddNotice(@Path(value = "id", encoded = true) String id,
@Field("user_id") String user_id,
@Field("title") String title,
@Field("description") String description,
@Field("school_id") String school_id,
@Field("filename") String filename);
Testé et fonctionne maintenant. La solution est juste d’ajouter encoded = true pour être sûr que l’URL correcte est touchée . Exemple:
@POST("{attendance_path}")
Single<Response> upLoadAttendence (@PartMap HashMap<String, RequestBody> postData,@Path(value = "attendance_path",encoded = true) String path);