在我的设置中,我从最初调用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控制。
答案 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);