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

时间:2014-05-23 15:37:19

标签: android retrofit

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:44)

使用@EncodedPath!就是这样。我会复制Javadoc所以这个答案有更多的东西:

  

URL路径中的命名替换。使用String.valueOf(Object)将值转换为字符串。字面上使用的值没有URL编码。有关等效的URL编码,请参阅@Path

像这样使用:

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

答案 1 :(得分:17)

由于@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, ..);

答案 2 :(得分:9)

有已知错误,您可以在以下位置观看错误报告: Retrofit @Github

还有指向可能解决方案的链接:Solution @Github

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

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

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

您的GET API:

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

此致

答案 3 :(得分:0)

我遇到了同样的问题,并按照以下代码解决了

 @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);

答案 4 :(得分:0)

经过测试,现在可以正常工作。 解决方案是仅添加encoding = true以确保正确的url被点击。 例如:

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