27. Retrofit2 -- How to Use Dynamic Urls for Requests

Retrofit
tutorial

最终,Retrofit 2 为动态 url 添加了一个额外的注解。在 Retrofit 1 中,它是一个 hackround[1]。但在 Retrofit 2 中,它是一个注解,用于端点申明。

该节显示了如何在单个请求上使用动态端点 url

用户案例场景


猛然间,你可能一时还想不到需要定义动态端口 url 的场景。那我们就给出两个示例,来说明真实世界的场景。

  1. 个人图片:如果应用允许用户上传个人图片,那么这些图片可能被存储在不同的位置。例如自己的服务器,或其它云存储服务器等。

  2. 文件上传:文件可以被存储在不同的位置,它们需要用任意资源路径,可以灵活的下载。

即使你的应用中没有上述的两个假想的功能,但是,你应该有适当的心态来完成这两个示例。

如何使用动态 Url


其实,对于 Retrofit 2 来说,动态 Url 只需要在端点定义中,添加一个使用 @Url 标注的字符串参数就可以了。简单的代码胜过千言万语,翠花,上代码:

  1. public interface UserService {  

  2. @GET 

  3. public Call<ResponseBody> profilePicture(@Url String url); 



正如你所见,@GET 注解后,没有任何端点信息,而是把 @Url 注解添加到方法本身了。

相对于基本地址,动态 Url 如何解析


这是另外一个值得注意的有趣的事情。Retrofit 2 使用了 OKHttpHTTPUrl,它把每一个端点 Url 都当成了网页上的一个链接(<a href=""></a>)。

让我们看一个例子:一个指向 Amazon S3 个人照片存储的 Url。我们将有两个 Url:一个是基本 Url,一个是个人照片方法使用的动态 Url

  1. Retrofit retrofit = Retrofit.Builder()  

  2. .baseUrl("https://your.api.url/"); 

  3. .build(); 


  4. UserService service = retrofit.create(UserService.class);  

  5. service.profilePicture("https://s3.amazon.com/profile-picture/path"); 


  6. // request url results in: 

  7. // https://s3.amazon.com/profile-picture/path 

因为你设置了完全不同的 hostscheme,因此,OKHttpHTTPUrl 将把方法中的 Url 解析为动态 Url

另一个例子:我们把个人照片的动态 Url 的服务与基本 Url 的服务设置为一致。

  1. Retrofit retrofit = Retrofit.Builder()  

  2. .baseUrl("https://your.api.url/"); 

  3. .build(); 


  4. UserService service = retrofit.create(UserService.class);  

  5. service.profilePicture("profile-picture/path"); 


  6. // request url results in: 

  7. // https://your.api.url/profile-picture/path 

这次,最终的请求 Url 由基本 Url 加上动态定义的端点 Url 所组成。这是因为 HttpUrl 识别出我们并没有定义 schemehost,因此,它会把这两者结合到一起。

第三个例子:假设后端开发者给产品推送了一个更新通知,使用的是上一个例子的知识:

  1. Retrofit retrofit = Retrofit.Builder()  

  2. .baseUrl("https://your.api.url/v2/"); 

  3. .build(); 


  4. UserService service = retrofit.create(UserService.class);  

  5. service.profilePicture("/profile-picture/path"); 


  6. // request url results in: 

  7. // https://your.api.url/profile-picture/path 

第三个例子和第二个例子的不同在于:在基本地址上,我们添加了 v2/,端点地址以 / 开头。因为端点地址以 / 开头,因此,端点地址会与基本地址中的 host 部分结合,也就是与最终的请求网址为:https://your.api.url/profile-picture/path。当端点地址以 / 开头时,基本地址除 host 之外的部分都会被忽略。

观点


你需要注意的是:正确创建请求 Url。本文中的示例显示了一些常见的陷阱,这些陷阱很容易就被触犯。要么确保使用包含 schemehostpath 的完整 Url,要么在使用 Url 前,好好的学习理解下。

我们建议:使用 Retrofit 2 处理 Url 时,要有足够的耐心。


  1. 不知道什么意思。hack around 是美国口语,有闲逛的意思。

27. Retrofit2 -- How to Use Dynamic Urls for Requests的更多相关文章

  1. Retrofit所有知识场景汇总

    https://futurestud.io/blog/retrofit-getting-started-and-android-client Retrofit Series Overview Gett ...

  2. Django Views: Dynamic Content

    世味年来薄似纱,谁令骑马客京华. 小楼一夜听春雨,深巷明朝卖杏花. 矮纸斜行闲作草,晴窗细乳戏分茶. 素衣莫起风尘叹,犹及清明可到家. Your Second View: Dynamic Conten ...

  3. http协议之cookie标准RFC6265介绍

      [Docs] [txt|pdf] [draft-ietf-httpst...] [Diff1] [Diff2] [Errata] PROPOSED STANDARD Errata Exist In ...

  4. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  5. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  6. Python-aiohttp百万并发

    http://www.aikaiyuan.com/10935.html 本文将测试python aiohttp的极限,同时测试其性能表现,以分钟发起请求数作为指标.大家都知道,当应用到网络操作时,异步 ...

  7. Http,Https (SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2 英文帮助文档 分类: ASP.NET 2014-10-28 10:50 147人阅读 评论(1) 收藏

    Security Switch 4.2 =================== Security Switch enables various ASP.NET applications to auto ...

  8. scrapy代理的设置

    scrapy代理的设置 在我的上一篇文章介绍了scrapy下载器中间件的使用,这里的scrapyIP的代理就是用这个原理实现的,重写了下载器中间件的process_request(self,reque ...

  9. LeetCode 120. Triangle (三角形)

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

随机推荐

  1. 【实践】js实现windows系统日历

    思路:1.定义好每一个月份的日期天数 2.获取当前的系统日期初始化数据 3.输出日历    2.1.先获取当前月的第一天是星期几(这一点与日历的排版至关重要!)    2.2.获取当前月的天数    ...

  2. KRBTabControl

    This article explains how to make a custom Windows Tab Control in C#. Download demo project - 82.4 K ...

  3. PAAS云服务平台

    云计算是一种可以方便.按需从网络訪问的.可配置的.共享的资源池(如网络.server.存储.应用程序和服务)模型,且仅仅需最少的管理(服务提供方交互)就可以高速供应和公布该模型. 云计算平台的核心部分 ...

  4. 有趣的Java之调皮的浮点数

    **当你在写一个电商网站的时候,你可能会给你的商品标价1.99,10.9这样的价格来吸引顾客.我应该用浮点数float/double来储存它们,当我的顾客购买商品的时候,从他们的账户里扣费,使用整型是 ...

  5. Android TabHost控件 右侧留空并增加按钮

    涉及公司内部程序,部分地方进行模糊处理. 公司Android程序的一个子程序UI要进行改版,最初的UI添加按钮是在内容区,而且TabHost空间是正常的标题平均分布.如下图(其实这是改版的第一版,没有 ...

  6. PHP上传文件功代码练习(单文件)

    前端: <html> <head><title>upload file</title> <meta http-equiv="Conten ...

  7. 关于mysql存储过程创建动态表名及參数处理

      转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  近期游戏開始第二次内測,開始处理操作日志.最開始把日志放到同一个表里面,发现一天时间,平均100玩家 ...

  8. Visual studio之C# 重新定义Messbox的显示窗口位置

    背景 当前做的APP需要新建一个设置窗口,该设置窗口会出现在靠近屏幕边缘位置,但主窗口铺满屏幕,设置窗口会弹出一些讯息,但默认情况下Messagebox窗口会居中于主窗口,这不太符合要求,正常应该居中 ...

  9. Hibernate映射set与List

    1.对于set类型,如果集合中的元素是简单地类型,如字符串型,set使用另外一种映射方式: team类: import java.util.HashSet; import java.util.Set; ...

  10. 使用scrapy进行12306车票查询

    概述 通过12306的查询API进行查询某日火车票, 结果保存在csv文件中. 详细 代码下载:http://www.demodashi.com/demo/12623.html 一.环境搭建 1. 安 ...