改造pathreplace:整个pathreplace(包括/)

在我的设置中,我从REST API的资源中获取了所有资源的path,从API初始调用。 我们使用这种模式,能够改变所有的资源path,而不会中断所有现有的应用程序版本。

我一直在玩Retrofit,并试图创build一个方法来接受我传递给它的任何path作为string。 我的尝试看起来像这样

@GET("/{path}") public FooBar getFooBar(@Path("path") String path); 

然后我尝试按以下方式调用它。

 String path = "foo/bar"; api.getFooBar(path); 

不幸的是翻新url – 编码pathreplace,我最终要求/foo%2Fbar而不是/foo/bar 。 有什么办法可以禁用URL编码进行pathreplace或者replace跨越多个path段吗? 不幸的是,我甚至不知道有多lesspath段,都是由API控制的。

Solutions Collecting From Web of "改造pathreplace:整个pathreplace(包括/)"

使用@EncodedPath ! 而已。 我会复制Javadoc,所以这个答案有更多的肉:

在URLpath中命名replace。 值使用String.valueOf(Object)转换为string。 值的使用没有URL编码的字面意思。 请参阅@Path for URL编码等效。

像这样使用它:

 @GET("/{path}") void example(@EncodedPath("path") String path, ..); 

由于@EncodedPath现在已被弃用

改造1.9:

 @GET("/{path}") void example(@Path(value = "path", encoded = false) String path, ..); 

改造2. *:

 @GET("/{path}") void example(@Path(value = "path", encoded = false) String path, ..); 

有已知的错误,你可以看错误报告: Retrofit @Github

还有一个链接到可能的解决scheme: 解决scheme@Github

最后,改造开发商的信息是:

“跨越多个path段的pathreplace将不被支持,如果path段的数量dynamic变化,您应该使用@Url以编程方式构build完整的相对URL。

所以,如果你在编码方面遇到麻烦,解决办法可以是:

您的API的GET:

 @GET Call<Object> Function(@Url String path, @Query("CONTENT") String content); 

您的POST的API:

 @FormUrlEncoded @POST Call<Object> Function(@Url String path, @Field("CONTENT") String content); 

你可以这样调用它:

 String thePath = "www.foo.de/foo/foo2"; Call<Object> call = api.Function(thePath,content); 

所以用这个你没有问题来编码的东西。

但是,如果你只是在版本2中寻找正常的编码。* API必须是这样的:

 @GET("/{path}") void example(@Path(value = "path", encoded = false) String path, ..); 

问候