在我的设置中,我从最初调用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编码等效项.
像这样使用它:
Run Code Online (Sandbox Code Playgroud)@GET("/{path}") void example(@EncodedPath("path") String path, ..);
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)
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)
问候
| 归档时间: |
|
| 查看次数: |
11781 次 |
| 最近记录: |