27. Retrofit2 -- How to Use Dynamic Urls for Requests
27. Retrofit2 -- How to Use Dynamic Urls for Requests
最终,Retrofit 2 为动态 url 添加了一个额外的注解。在 Retrofit 1 中,它是一个 hackround[1]。但在 Retrofit 2 中,它是一个注解,用于端点申明。
该节显示了如何在单个请求上使用动态端点 url。
用户案例场景
猛然间,你可能一时还想不到需要定义动态端口 url 的场景。那我们就给出两个示例,来说明真实世界的场景。
个人图片:如果应用允许用户上传个人图片,那么这些图片可能被存储在不同的位置。例如自己的服务器,或其它云存储服务器等。
文件上传:文件可以被存储在不同的位置,它们需要用任意资源路径,可以灵活的下载。
即使你的应用中没有上述的两个假想的功能,但是,你应该有适当的心态来完成这两个示例。
如何使用动态 Url
其实,对于 Retrofit 2 来说,动态 Url 只需要在端点定义中,添加一个使用 @Url 标注的字符串参数就可以了。简单的代码胜过千言万语,翠花,上代码:
- public interface UserService {
- @GET
- public Call<ResponseBody> profilePicture(@Url String url);
- }
正如你所见,@GET 注解后,没有任何端点信息,而是把 @Url 注解添加到方法本身了。
相对于基本地址,动态 Url 如何解析
这是另外一个值得注意的有趣的事情。Retrofit 2 使用了 OKHttp 的 HTTPUrl,它把每一个端点 Url 都当成了网页上的一个链接(<a href=""></a>)。
让我们看一个例子:一个指向 Amazon S3 个人照片存储的 Url。我们将有两个 Url:一个是基本 Url,一个是个人照片方法使用的动态 Url。
- Retrofit retrofit = Retrofit.Builder()
- .baseUrl("https://your.api.url/");
- .build();
- UserService service = retrofit.create(UserService.class);
- service.profilePicture("https://s3.amazon.com/profile-picture/path");
- // request url results in:
- // https://s3.amazon.com/profile-picture/path
因为你设置了完全不同的 host 和 scheme,因此,OKHttp 的 HTTPUrl 将把方法中的 Url 解析为动态 Url。
另一个例子:我们把个人照片的动态 Url 的服务与基本 Url 的服务设置为一致。
- Retrofit retrofit = Retrofit.Builder()
- .baseUrl("https://your.api.url/");
- .build();
- UserService service = retrofit.create(UserService.class);
- service.profilePicture("profile-picture/path");
- // request url results in:
- // https://your.api.url/profile-picture/path
这次,最终的请求 Url 由基本 Url 加上动态定义的端点 Url 所组成。这是因为 HttpUrl 识别出我们并没有定义 scheme 和 host,因此,它会把这两者结合到一起。
第三个例子:假设后端开发者给产品推送了一个更新通知,使用的是上一个例子的知识:
- Retrofit retrofit = Retrofit.Builder()
- .baseUrl("https://your.api.url/v2/");
- .build();
- UserService service = retrofit.create(UserService.class);
- service.profilePicture("/profile-picture/path");
- // request url results in:
- // https://your.api.url/profile-picture/path
第三个例子和第二个例子的不同在于:在基本地址上,我们添加了 v2/,端点地址以 / 开头。因为端点地址以 / 开头,因此,端点地址会与基本地址中的 host 部分结合,也就是与最终的请求网址为:https://your.api.url/profile-picture/path。当端点地址以 / 开头时,基本地址除 host 之外的部分都会被忽略。
观点
你需要注意的是:正确创建请求 Url。本文中的示例显示了一些常见的陷阱,这些陷阱很容易就被触犯。要么确保使用包含 scheme、host 和 path 的完整 Url,要么在使用 Url 前,好好的学习理解下。
我们建议:使用 Retrofit 2 处理 Url 时,要有足够的耐心。
不知道什么意思。
hack around是美国口语,有闲逛的意思。 ↩
27. Retrofit2 -- How to Use Dynamic Urls for Requests的更多相关文章
- Retrofit所有知识场景汇总
https://futurestud.io/blog/retrofit-getting-started-and-android-client Retrofit Series Overview Gett ...
- Django Views: Dynamic Content
世味年来薄似纱,谁令骑马客京华. 小楼一夜听春雨,深巷明朝卖杏花. 矮纸斜行闲作草,晴窗细乳戏分茶. 素衣莫起风尘叹,犹及清明可到家. Your Second View: Dynamic Conten ...
- http协议之cookie标准RFC6265介绍
[Docs] [txt|pdf] [draft-ietf-httpst...] [Diff1] [Diff2] [Errata] PROPOSED STANDARD Errata Exist In ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- Python-aiohttp百万并发
http://www.aikaiyuan.com/10935.html 本文将测试python aiohttp的极限,同时测试其性能表现,以分钟发起请求数作为指标.大家都知道,当应用到网络操作时,异步 ...
- 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 ...
- scrapy代理的设置
scrapy代理的设置 在我的上一篇文章介绍了scrapy下载器中间件的使用,这里的scrapyIP的代理就是用这个原理实现的,重写了下载器中间件的process_request(self,reque ...
- LeetCode 120. Triangle (三角形)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
随机推荐
- Shadow Map 原理和改进 【转】
http://blog.csdn.net/ronintao/article/details/51649664 参考 1.Common Techniques to Improve Shadow Dept ...
- 提取nds游戏的音乐
nds游戏绝对是游戏界的瑰宝,尤其是有些游戏的音乐还很好听,所以想把它们提取出来.网上搜了下教程,这里整理一下,全程在archlinux下操作. 首先用到的工具是(vgmtrans)[https:// ...
- activemq两种实现方式
第一种:点对点 #发布者public class Producer { private static final String userName = ActiveMQXAConnectionFacto ...
- Spark修炼之道——Spark学习路线、课程大纲
课程内容 Spark修炼之道(基础篇)--Linux基础(15讲).Akka分布式编程(8讲) Spark修炼之道(进阶篇)--Spark入门到精通(30讲) Spark修炼之道(实战篇)--Spar ...
- UIWebView捕获内部web点击事件
在此有一个webView默认是打开 百度的页面:设置代理,并在代理中处理 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest ...
- ES6 WeakMap Map 区别
WeakMap与Map的区别 1.WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名. 2.WeakMap的键名所指向的对象,不计入垃圾回收机制. 示例: const wm ...
- 关于苹果开发证书失效的解决方式(2016年2月14日Failed to locate or generate matching signing assets)
前言: 从2月14日開始,上传程序的同学可能会遇到提示上传失败的提示. 而且打开自己的钥匙串,发现所有的证书所有都显示此证书签发者无效. Failed to locate or generate ma ...
- 08-hibernate注解-多对多单向外键关联
多对多单向外键 1,学生和教师构成多对多的关联关系 2,其中一个多方持有另一个多方的集合对象(学生持有教室的集合) 3,通过注解@JoinTable,创建中间表(作为多对多的载体,用来确定学生和教师的 ...
- ISA95的抽象惯例
要想理解ISA95.而且应用到设计中去.就要理解ISA95背后的抽象模式,以下这个图是我依据我对ISA95的理解画出来的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- (一)Solr——简介和安装配置
1. solr简介 1.1 Solr是什么 Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器. Solr和lucene的版本是同步更新的,最新的版本是7. ...