为什么 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 中添加尾部斜杠? 的相关文章

  • Sqlite 查询检查 - 小于和大于

    return mDb query DATABASE TABLE new String KEY ROWID KEY LEVEL KEY LEVEL gt 3 lt 5 null null null null 我究竟做错了什么 它返回的值全部高
  • Android Studio磁盘空间不足如何解决?

    我随机收到此错误 并且不确定为什么 Android Studio 的磁盘空间变低 Android Studio 系统目录分区磁盘空间不足 Update 此应用程序安装在运行 10 10 1 的 Mac 上 具有 251GB 内部存储和占用
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • 在 Android 中关闭 Spinner 中的下拉菜单

    在 Android 中打开和关闭微调器时 我需要为箭头图标设置动画 打开微调器时我可以旋转箭头 我只是放了一个setOnTouchListener on the Spinner 当下拉菜单关闭或隐藏时 问题就来了 因为我不知道如何在该操作上
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • android studio 底部工具栏的“运行”选项卡消失了

    Android Studio 底部工具栏中曾经有一个 运行 选项卡 但该选项卡不再显示 怎么把它带回来 请检查下图以了解它消失之前的位置 Run 选项卡曾经位于 TODO 选项卡之前的红色圆圈中 查看 gt 工具窗口 gt 运行 Or us
  • 安卓;在 AdapterViewFlipper 上设置输入/输出动画:未知的动画师名称翻译

    我有一些非常简单的动画 可以与 ViewFlipper 完美配合 但如果我尝试在 AdapterViewFlipper 输入 输出上设置它们 我会收到运行时错误 未知的动画师名称翻译 查看每个方法的相应方法 看起来 ViewFlipper
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 来自外部 XML 的 Android 本地化

    是否可以使用从服务接收到的 XML 在运行时翻译 Android 应用程序 如果可能的话 请有人指出我正确的方向 谢谢 Warning 我读到的所有内容都表明 让您的应用程序更改语言不是一个好主意 因为 Android 框架不支持它 并且可
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • Android框架结构与MFC/Win32结构的比较?

    我为 Android 和 Windows 进行开发 使用 MFC 有时使用 win32 昨天我随意比较了这两个框架 它们显然非常非常不同 因此 Windows 开发与 Android 开发有很大不同 我想知道人们认为 Android 这样的
  • 如果联系人与电话通讯录中的应用程序关联,则显示应用程序图标

    我正在尝试显示与该应用程序关联的电话号码的应用程序图标 我试着跟随this http www c99 org 2010 01 23 writing an android sync provider part 1 链接但是太难了 有没有任何库
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • onTouch 给出奇怪的触摸点 Android

    我正在做的事情非常简单 我以前做过 但现在它没有按我的预期运行 无论如何 让我简要解释一下我正在尝试做什么以及我得到了什么 设想 我有一个RelativeLayout其中一个ImageView已放置 现在我设置touchlistener像这
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • 在 TextView onTextChanged 上设置文本

    我有一个定义为类属性的文本视图 以便我可以在整个类中访问它 在 onCreate 方法中我执行以下操作 chars TextView findViewById R id chars chars setText 300 之后 public v
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • RecyclerView元素更新+异步网络调用

    我有一个按预期工作的回收视图 我的布局中有一个按钮可以填充列表 该按钮应该进行异步调用 根据结果 我更改按钮的外观 这一切都发生得很好 但是 当我单击按钮并快速向下滚动列表时 异步调用的结果会更新新视图的按钮 代替旧视图的视图 我该如何处理

随机推荐

  • 当 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 作为服务接口的一