【问题标题】:Retrofit path replacements: replacement over whole path (including /)改造路径替换:替换整个路径(包括/)
【发布时间】:2014-07-13 01:16:27
【问题描述】:

在我的设置中,我从 REST API 获取资源的所有路径,这些路径来自对 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控制的。

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    使用@EncodedPath!而已。我将复制 Javadoc,这样这个答案就有更多内容了:

    URL 路径中的命名替换。使用String.valueOf(Object) 将值转换为字符串。值在没有 URL 编码的情况下按字面意思使用。请参阅@Path 以获取等效的 URL 编码。

    像这样使用它:

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

    【讨论】:

    • 我现在不能尝试,但由于它非常明显,我会相信你并接受答案。非常感谢! :-)
    • 是的。从 1.7.0 开始,您可以使用 @Path 及其标志之一。
    • @GET("/user/{name}") void notEncoded(@Path(value="name", encode=false) 字符串名称);
    • 以上解决方案均不适用于 Retrofit 2.0。我为此在github.com/square/retrofit/issues/1364 创建了一个问题
    • 使用@Code_Life 解决方案,因为@EncodedPath 已被弃用。使用@Path(value = "link", encode = false) String link
    【解决方案2】:

    由于@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.3 中更改了 encoded=true。
    • 编码标志实际上意味着:true - 我自己进行了编码,非常感谢你 false - 请为我进行编码。至少可以说是模棱两可的!
    【解决方案3】:

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

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

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

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

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

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

    问候

    【讨论】:

    • 是的,他们将其从编码更改为使用 2.0.0 编码
    【解决方案4】:

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

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

    【讨论】:

    • 当您在字符串路径中包含符号 ? 时,这不起作用
    【解决方案5】:

    我遇到了同样的问题,用下面的代码解决了

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

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2011-01-24
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多