为什么 Retrofit 会在所有 URL 中添加尾部斜杠?

2024-01-08

编辑问题并提供更多详细信息:

我了解Retrofit中服务接口的使用。我想调用这样的 URL:http://a.com/b/c http://a.com/b/c(稍后使用服务接口附加查询参数)。

我的限制是:

  1. I cannot使用 /b/c 作为服务接口的一部分(作为路径参数)。我需要它作为基本网址的一部分。我在下面详细说明了原因。

  2. I cannot能够承受由此产生的呼叫http://a.com/b/c/?key=val http://a.com/b/c/?key=val。我需要的是http://a.com/b/c?key=val http://a.com/b/c?key=val(“c”后面的尾部斜杠给我的 API 带来了问题)。更多详细信息如下。

我的服务器 API 更改非常频繁,并且我在使用 Retrofit 的客户端上遇到了麻烦。主要问题是我们不能将动态值(非最终)传递给路径参数的 @GET 或 @POST 注释(就像查询参数一样)。例如,当 API 发生变化时,甚至路径参数的数量也会发生变化。我们不能承受每次 API 变化时都有不同的接口。

解决此问题的一种方法是形成完整的 URL,即具有 Base_Url + Path_Parameters 的端点。

但我想知道为什么 Retrofit 强制在基本 url 中添加尾部斜杠(“/”):

        String API_URL = "https://api.github.com/repos/square/retrofit/contributors";
        if (API_URL.endsWith("/")) {
            API_URL = API_URL.substring(0, API_URL.length() - 1);
        }
        System.out.println(API_URL);   //prints without trailing "/"

        RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(API_URL)
        .build();

API_URL 始终被重置为https://api.github.com/repos/square/retrofit/contributors/ https://api.github.com/repos/square/retrofit/contributors/由 Retrofit 内部进行(通过记录请求确认了这一点)

解决此问题的一种方法是手动添加“?”最后防止添加“/”:https://api.github.com/repos/square/retrofit/contributors https://api.github.com/repos/square/retrofit/contributors?

不幸的是,我们的 API 不会接受此类请求。

  1. 为什么 Retrofit 会强制这种行为?
  2. 对于像我这样不想要尾部斜杠的人有解决方案吗?
  3. 我们可以将可变参数(非最终)传递给 Retrofit @GET 或 @POST 注释吗?

您需要将基本 URL 传递给setEndpoint(...)并定义/repos/...在您的服务界面中。

一个快速演示:

class Contributor {

    String login;

    @Override
    public String toString() {
        return String.format("{login='%s'}", this.login);
    }
}

interface GitHubService {

    @GET("/repos/{organization}/{repository}/contributors")
    List<Contributor> getContributors(@Path("organization") String organization,
                                      @Path("repository") String repository);
}

然后在你的代码中,你这样做:

GitHubService service = new RestAdapter.Builder()
        .setEndpoint("https://api.github.com")
        .build()
        .create(GitHubService.class);

List<Contributor> contributors = service.getContributors("square", "retrofit");
System.out.println(contributors);

这将打印:


[{login='JakeWharton'}, {login='pforhan'}, {login='edenman'}, {login='eburke'}, {login='swankjesse'}, {login='dnkoutso'}, {login='loganj'}, {login='rcdickerson'}, {login='rjrjr'}, {login='kryali'}, {login='holmes'}, {login='adriancole'}, {login='swanson'}, {login='crazybob'}, {login='danrice-square'}, {login='Turbo87'}, {login='ransombriggs'}, {login='jjNford'}, {login='icastell'}, {login='codebutler'}, {login='koalahamlet'}, {login='austynmahoney'}, {login='mironov-nsk'}, {login='kaiwaldron'}, {login='matthewmichihara'}, {login='nbauernfeind'}, {login='hongrich'}, {login='thuss'}, {login='xian'}, {login='jacobtabak'}]  

我们可以将可变参数(非最终)传递给 Retrofit @GET 或 @POST 注释吗?

不可以,(Java) 注释内的值必须声明为最终值。然而,你can定义变量路径,如我在演示中所示。

EDIT:

请注意杰克在评论中的评论:

值得注意的是,原始问题中链接的代码处理您通过时的情况https://api.github.com/ https://api.github.com/(注意尾部斜杠)并且它被连接到 /repos/... (注意前导斜杠)。 Retrofit 会在相对 URL 注释参数上强制使用前导斜杠,因此如果 API url 上有尾随斜杠,则会进行重复数据删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Retrofit 会在所有 URL 中添加尾部斜杠? 的相关文章

随机推荐

  • 当 mixin 方法名冲突时,如何选择调用的方法?

    当您在方法名称冲突的类中包含模块时 它将使用该类定义的方法 有没有办法选择我想要运行的一个 module B def self hello hello B end end class A include B def self hello h
  • 在 ASP.net MVC6 网站上使用 Office Interop

    我想从我的 ASP net MVC 6 网站生成 Word 文档 我已经实现了多种在 POC 中生成文档的方法 DocX NetOffice OpenXml COM Interop 对象 我被它诱惑了 我制作了一个控制台应用程序来测试并且它
  • 如何将Firebase的身份验证链接到实时数据库?

    正如标题所说 我需要将经过身份验证的用户链接到数据库 这样不同的用户只能看到自己的数据 我已经成功实现了Firebase的身份验证功能 但记录不会保存到实时数据库 我不知道如何执行此操作 谁能教我如何实现这样的功能 我尝试了数据库 我大致知
  • 我可以在 Swift 中模拟特征/混合吗?

    Swift 是否有一种像 Scala 那样混合特征的方法 Swift 书中关于使用扩展向现有类添加协议的部分非常接近 但是 由于协议不能包含实现 因此不能用于将代码混合到类中 还有别的办法吗 模拟混合的一种方法是使用通用函数来提供实现 例如
  • ClassCastException:org.sonar.java.model.expression.MethodInitationTreeImpl 无法转换为 org.sonar.plugins.java.api.tree.IdentifierTree

    今天我们将SonarQube Java插件从3 2升级到3 3 http docs sonarqube org display PLUG Java Plugin http docs sonarqube org display PLUG Ja
  • 如何将 Micrometer 计时器与 webflux 端点一起使用

    是否有任何简单的方法可以将 Micrometer 计时器与 Webflux 控制器一起使用 看来 Timed 仅适用于非反应式方法 对于反应性来说 它记录的时间值非常低 我发现了一个类似的问题 如何使用 Micrometer Timer 记
  • 将两个 xml 片段合并为一个?

    如何合并xml内容 a and b into c declare a xml select 1 aaa for xml path AAAs declare b xml select 1 bb1 2 bb2 for xml path BBBs
  • 使用 HttpServer 或 HttpSelfHostServer 对 Web API 进行单元测试

    我正在尝试为 Web API 项目进行一些单元测试 我将模拟 Web API 托管环境 看来我可以使用内存主机 HttpServer 或自主机 HttpSelfHostServer 只是想知道有什么区别 哪种技术有什么好处 以及这些选项是否
  • Git-Svn dcommit 导致分支分裂

    我遇到了 git svn dcommits 问题 导致 git 存储库无法跟踪哪些提交 我尝试确保 git 中的 master 分支始终遵循 SVN 存储库中的 trunk 所以每当我工作时 我都会在一个主题分支上 这是我的场景 在主题分支
  • php 中的长计算会导致 503 错误

    我的脚本需要很长时间才能执行 结果服务器响应 503 错误 如何设置更长的执行时间 在我的 PHP 脚本中我设置 set time limit 0 ignore user abort true 这个问题非常类似于PHP 后台进程 https
  • 将数据库从sql server 2008 r2备份恢复到2008

    我需要将sql server 2008R2上的数据库备份和恢复到sql server 2008 备份文件不兼容这种方式 我发现的另一个选项是生成包含数据的脚本 由于我使用大量外键对数据库进行了规范化 插入会成功吗 还有其他可靠的方法吗 正如
  • Web Audio API:停止播放所有预定的声音

    所以我有一堆加载的音频样本 我在下面的代码中调用调度函数 let audio function playChannel let audioStart context currentTime let next 0 for let i 0 i
  • 如何获取离线安装的所有nuget依赖项

    我使用两台电脑 一台有互联网连接 另一台没有互联网连接 我想在脱机计算机上安装 Nuget 包 Nuget server 及其所有依赖项 不幸的是 仅仅下载软件包本身是不可能的 我必须手动下载所有依赖项 而且有几十个依赖项 如何在具有 In
  • 希望从大量 javascript 文件中删除注释

    这是我的困境 我是一个 javascript 菜鸟 目前正在实习并帮助维护两个电子商务网站 我最近被指派删除我们 javascript 库中出现的所有评论 超过 25 000 条评论 显然我想找到一个函数或一些预先存在的程序 可以解析代码
  • 如何更改滑动(可可)自定义工作表的点?

    我想在我的 Mac 应用程序中使用一个带有自定义高度标题栏的主窗口 例如 sparrow twitter 应用程序 mac 阅读器等 我在用着https github com indragiek INAppStoreWindow https
  • SQL Server Nvarchar 和 Java 准备好的语句

    我有一个关于将字符串插入 SQL Server 2008 R2 的问题 当我尝试插入带有一些国家 地区字母的字符串时 我收到 反而 我知道添加N在字符串文字的开头可以解决这个问题 但我使用的是 JDBC 准备好的语句 如下所示 INSERT
  • Selenium:如何通过部分href查找元素?

    工作代码1 Driver Instance FindElement By XPath a contains href PartialLinkHref 工作代码2 ReadOnlyCollection
  • 如何查找基类库中实现特定接口的类型列表?

    有时我想找出实现特定接口的所有标准 NET 类型的列表 通常是出于好奇 有时也有一些实际目的 但这不是重点 我试图从 MSDN 中获取此内容 但类型的页面仅包含类型的子级链接 而不包含实现接口的类型 您知道如何做到这一点的任何技巧 或有帮助
  • 选择R中n个最远的点

    给定一组 xy 坐标 如何选择 n 个点以使这 n 个点彼此距离最远 一种低效方法可能不适用于大数据集 如下所示 从 1000 个点中找出距离最远的 20 个点 xy lt cbind rnorm 1000 rnorm 1000 n lt
  • 为什么 Retrofit 会在所有 URL 中添加尾部斜杠?

    编辑问题并提供更多详细信息 我了解Retrofit中服务接口的使用 我想调用这样的 URL http a com b c http a com b c 稍后使用服务接口附加查询参数 我的限制是 I cannot使用 b c 作为服务接口的一