改造路径替换:替换整个路径(包括/)

在我的设置中,我从最初调用API的REST API获取了我的资源的所有路径。 我们使用此模式可以更改所有资源路径,而不会破坏流程中的所有现有应用程序版本。

我一直在玩Retrofit,我试图创建一个方法,接受我作为字符串传递给它的任何路径。 我的尝试看起来像这样

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

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

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

不幸的是Retrofit URL-Encodes路径替换,我最终向/foo%2Fbar而不是/foo/bar发出请求。 有没有办法禁用路径替换的URL编码或跨越多个路径段的替换? 不幸的是,我甚至不知道有多少路径段,它都由API控制。

Solutions Collecting From Web of "改造路径替换:替换整个路径(包括/)"

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

URL路径中的命名替换。 使用String.valueOf(Object)将值转换为字符串。 字面上使用的值没有URL编码。 请参阅@Path获取等效的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

还有一个可能解决方案的链接: 解决方案@Github

最后,来自改造开发者的信息是:

“不支持跨越多个路径段的路径替换,如果路径段的数量动态变化,则应使用@Url以编程方式构建完整的相对URL。”

因此,如果您遇到编码问题,解决方案可以是:

您的GET API:

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

您的POST API:

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

你可以这样称呼它:

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

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

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

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

问候

我面临同样的问题并解决它如下面的代码

  @POST(ApiKey.URL.add_edit_notice + "{id}") @FormUrlEncoded Call 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); 

经过测试,现在正在使用。 解决方案只是添加encoded = true以确保点击正确的url。 例如:

 @POST("{attendance_path}") Single upLoadAttendence (@PartMap HashMap postData,@Path(value = "attendance_path",encoded = true) String path);