web-dev-qa-db-fra.com

Remplacement des chemins de rénovation: remplacement sur le chemin complet (y compris /)

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.

26
Thrakbad

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, ..);
43
Jake Wharton

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, ..);
16
Andrey

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

9
Klatschen

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);
0
tej shah

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);
0
Debasish Ghosh