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

Thr*_*bad 29 android retrofit

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

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

@GET("/{path}")
public FooBar getFooBar(@Path("path") String path);
Run Code Online (Sandbox Code Playgroud)

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

String path = "foo/bar";
api.getFooBar(path);
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ton 44

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

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

像这样使用它:

@GET("/{path}")
void example(@EncodedPath("path") String path, ..);
Run Code Online (Sandbox Code Playgroud)

  • @GET("/ user/{name}")void notEncoded(@Path(value ="name",encode = false)String name); (13认同)
  • 使用@Code_Life解决方案,因为```@ EncodedPath```已被弃用.使用```@Path(value ="link",encode = false)字符串链接``` (6认同)
  • 是.从1.7.0开始,你可以使用`@Path`和它的一个标志. (5认同)
  • 上述解决方案均不适用于Retrofit 2.0.我在https://github.com/square/retrofit/issues/1364上为此创建了一个问题 (2认同)

And*_*rey 18

由于@EncodedPath现已弃用

改造1.9:

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

改造2.*:

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

  • 它对我有用,但我在改装2.3中更改了编码= true. (3认同)
  • 编码标志实际上意味着: true - 我自己编码,非常感谢你 false - 请帮我编码。至少可以说这是模棱两可的! (2认同)

Kla*_*hen 10

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

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

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

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

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

您的GET API:

@GET
Call<Object> Function(@Url String path, @Query("CONTENT") String content);
Run Code Online (Sandbox Code Playgroud)

您的POST API:

@FormUrlEncoded
@POST
Call<Object> Function(@Url String path, @Field("CONTENT") String content);
Run Code Online (Sandbox Code Playgroud)

你可以用它调用它:

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

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

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

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

问候

  • 是的,他们将其从编码改为2.0.0编码 (2认同)