这篇文章给大家分享的是有关怎么动态改变改造的基url和其他版本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
<强>概述强>
随着谷歌对HttpClient摒弃,和截击的逐渐没落,OkHttp开始异军突起,而改造则对OkHttp进行了强制依赖。
改造是由平方公司出品的针对于Android和Java的类型安全的Http客户端,
如果看源码会发现其实质上就是对OkHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类封装了网络接口请求的底层,
其将请求返回javaBean,对网络认证rest API进行了很好对支持此,使用改造将会极大的提高我们应用的网络体验。
<强>其他强>
既然是RESTful架构,那么我们就来看一下什么是休息吧。
rest (REpresentational State Transfer)是一组架构约束条件和原则。
RESTful架构都满足以下规则:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个Http动词,对服务器端资源进行操作,实现“表现层状态转化”。
下面话不多说了,来开始本文的正文吧
<强> 1。需求与前提强>
<>强基url 强>
默认基本url: https://cloud.devwiki.net <代码> 代码>
测试版的url: https://dev.devwiki.net <代码> 代码>
私有云版本url: https://private.devwiki.net <代码> 代码>
<强>其他版本强>
- <李>
/rest/v1/
李> <李>/rest/v2/
李> <李>/rest/v3/
李> <强>需求点强>
- <李>
大部分接口使用云主机,部分接口使用私有主机
李> <李>大部分接口使用rest/v3版本,部分接口使用v2, v1版本。李李
> <>每个主机都有可能存在v1, v2, v3的接口
李> <强> 2。实现思路强>
okhttp可以添加拦截器,可在发起访问前进行拦截,通常我们会在拦截器中统一添加头,比如:
class HeaderInterceptor implements Interceptor { , ,private static  final String  ENCODING_GZIP =,“gzip"; ,private static  final String  CONTENT_TYPE_JSON =,“application/json; charset=UTF-8"; ,private static  final String  HEADER_CONTENT_TYPE =,“Content-Type"; ,private static  final String  HEADER_ACCEPT_TYPE =,“应用程序/json"; ,private static  final String  HEADER_CONTENT_ENCODING =,“Content-Encoding"; ,private final  static String  CHARSET =,“UTF-8"; , ,@Override ,public Response 拦截(Chain 链),throws IOException { Request 才能;originRequest =, chain.request (); Request.Builder 才能;newBuilder =, originRequest.newBuilder (); newBuilder.addHeader才能(“Accept",, HEADER_ACCEPT_TYPE); newBuilder.addHeader才能(“Accept-Charset",,字符集); newBuilder.addHeader才能(“Accept-Encoding",, ENCODING_GZIP); newBuilder.addHeader才能(“Accept-Language",, Locale.getDefault () .toString () .replace (“_",,“产生绯闻;)); newBuilder.addHeader才能(HEADER_CONTENT_TYPE, CONTENT_TYPE_JSON); return 才能;chain.proceed (newBuilder.build ()); ,} }
同理我们也可以在所有请求中添加统一的uuid或者关键进行防劫持或者认证。比如:
Request originRequest =, chain.request (); if (paramsMap !=, null), { ,HttpUrl originUrl =, originRequest.url (); ,HttpUrl.Builder newBuilder =, originUrl.newBuilder (); ,for (String key : paramsMap.keySet ()), { newBuilder.addEncodedQueryParameter才能(关键,paramsMap.get(关键)); ,} ,HttpUrl newUrl =, newBuilder.build (); ,Request newRequest =, originRequest.newBuilder () .url (newUrl) .build (); ,return chain.proceed newRequest (); } return chain.proceed (originRequest);
那么,同样我们可以再拦截器中进行主机和路径的替换,那么怎么替换呢?
<强> 3。实现过程强>
<强> 3.1定义主机类型和其他版本强>
主机类型:
interface HostName { ,String CLOUD =,“CLOUD"; ,String PRIVATE =,“PRIVATE"; ,String DEV =,“DEV"; } , interface HostValue  { ,String CLOUD =,“https://www.baidu.com"; ,String PRIVATE =,“https://private.bidu.com"; ,String DEV =,“https://dev.baidu.com"; }怎么动态改变改造的基url和其他版本