关于okhttp:Android网络请求监控与数据上报

Monitor-Network基于 ServiceLoader,监控 Okhttp网络申请,实现拦挡、解析、转发、存储、上报等性能。采纳组件化开发方式,各业务组件均可独自拆分应用,同时提供export对外调用组件,内部调用无需关怀外部实现,组件之间集成齐全解耦 Github 地址 > https://github.com/MannaYang/Monitor-Network集成组件介绍Components-stone提供根底依赖治理build.gradle.kts(可批改依赖版本)提供DataStore/Gson/RetrofitProvider对外调用治理类(可替换)提供NetworkInterceptor全局拦截器(Okhttp Interceptor)(如需替换,需全局解决接口注解)提供Application生命周期散发治理,基于@AutoService注解生成并解耦(如需替换,需全局解决接口注解)Components-http-export该组件为对外集成组件,可间接依赖 HttpDataResult.kt提供对外获取Interceptor拦截器解析实体modelHttpInterceptorListener.kt提供对外转发实体model数据接口,可供下层业务获取网络申请数据并自定义解决,参考app组件模块[HttpInterceptor.kt]Components-http该组件是http-export外部业务实现组件,解决网络申请白名单、解析、转发等业务操作,不可间接依赖,倡议下层business业务集成 HttpInterceptor.kt拦挡原始okhttp网络申请,并组装实体模型HttpResult.ktHttpResultParser.kt解析原始申请header、body、formBody并组合[HttpDataResult]模型DispatchProvider.kt通过异步协程与ServiceLoader转发http解决实现的数据模型Components-room-export该组件为对外集成组件,可间接依赖 HttpDataEntity.kt数据库表映射关联实体模型,供内部组合数据并存储数据源,参考app组件HttpInterceptor.ktHttpDataManage.kt数据库对外操作接口,提供增删改查及自定义查问sql性能QueryFilter.kt自定义查问过滤条件,参考app组件MainActivity.ktComponents-room该组件是room-export外部业务实现组件,提供room database、table、dao实现 HttpDataBaseLifecycle.kt生命周期内初始化room相干组件,获取dao操作实例HttpDataDaoProvider.kt实体模型与Table表映射关系关联HttpDataManage.kt数据库增删改查具体实现,关联room-export组件中[HttpDataManage.kt]Components-report-export该组件为对外集成组件,可间接依赖 WorkReport.kt对外开放业务查问过滤实体、业务上报平台辨别,关联WorkManager-InputData参数Components-report该组件是report-export外部业务实现组件,提供WorkManager后盾上报性能 dingtalk钉钉工作空间及鉴权服务与数据上报(仅作参考),具体实现可换为实际上报业务平台markdown格式化上报报文(仅作参考),具体按理论业务要求解决work解决数据上报及冗余数据处理(仅作参考),具体按理论业务要求解决Components-app下层业务集成组件壳,蕴含所有export及外部实现组件,组装额定公共参数(用户信息、设施信息、利用信息) kapt("com.google.auto.service:auto-service:1.1.1")api("com.google.auto.service:auto-service-annotations:1.1.1")implementation(project(":stone"))implementation(project(":http"))implementation(project(":http-export"))implementation(project(":room"))implementation(project(":room-export"))implementation(project(":report"))implementation(project(":report-export"))具体调用办法在[MainActivity.kt]与[HttpInterceptor.kt],利用内BaseApplication应替换为我的项目理论应用类 应用阐明我的项目中为了演示成果采纳钉钉上报,因而须要申请企业应用AppKey/SecretKey/AgentId/进行鉴权以,通过以上key信息获取UserIds实现音讯推送告诉,理论利用中举荐上报到日志中台或相干日志平台,作为全链路监控的一环 钉钉开放平台 > https://open.dingtalk.com/ gradle.properties需配置以下内容,关联影响鉴权办法地位 : DingRepository.kt # Ding key configdingAppKey=dingSecretKey=dingAgentId=dingUsersId=理论调用代码示例 DingProvider.ktsuspend fun reportWorkSpace(title: String, content: String, success: (Boolean) -> Unit) { ... ... ...}可自定义DataServerProvider.kt ,解决理论数据上报平台suspend fun reportDataServer(title: String, content: String, success: (Boolean) -> Unit) { //do something}suspend fun reportDataOther(title: String, content: String, success: (Boolean) -> Unit) { //do something}演示成果截图 screenshot ...

September 25, 2023 · 2 min · jiezi

关于okhttp:深入浅出-OkHttp-源码解析及应用实践

作者:vivo 互联网服务器团队- Tie QinruiOkHttp 在 Java 和 Android 世界中被宽泛应用,深刻学习源代码有助于把握软件个性和进步编程程度。 本文首先从源代码动手简要剖析了一个申请发动过程中的外围代码,接着通过流程图和架构图概括地介绍了OkHttp的整体构造,重点剖析了拦截器的责任链模式设计,最初列举了OkHttp拦截器在我的项目中的理论利用。 一、背景介绍在生产实践中,经常会遇到这样的场景:须要针对某一类 Http 申请做对立的解决,例如在 Header 里增加申请参数或者批改申请响应等等。这类问题的一种比拟优雅的解决方案是应用拦截器来对申请和响应做对立解决。 在 Android 和 Java 世界里 OkHttp 凭借其高效性和易用性被宽泛应用。作为一款优良的开源 Http 申请框架,深刻理解它的实现原理,能够学习优良软件的设计和编码教训,帮忙咱们更好到地应用它的个性,并且有助于非凡场景下的问题排查。本文尝试从源代码登程探索 OkHttp 的基本原理,并列举了一个简略的例子阐明拦截器在咱们我的项目中的理论利用。本文源代码基于 OkHttp 3.10.0。 二、OkHttp 基本原理2.1 从一个申请示例登程OkHttp 能够用来发送同步或异步的申请,异步申请与同步申请的次要区别在于异步申请会交由线程池来调度申请的执行。应用 OkHttp 发送一个同步申请的代码相当简洁,示例代码如下: 同步 GET 申请示例// 1.创立OkHttpClient客户端OkHttpClient client = new OkHttpClient();public String getSync(String url) throws IOException { OkHttpClient client = new OkHttpClient(); // 2.创立一个Request对象 Request request = new Request.Builder() .url(url) .build(); // 3.创立一个Call对象并调用execute()办法 try (Response response = client.newCall(request).execute()) { return response.body().string(); } }其中 execute() 办法是申请发动的入口,RealCall 对象的 execute() 办法的源代码如下: ...

May 18, 2023 · 3 min · jiezi

关于okhttp:由浅入深聊聊OkHttp的那些事

引言在 Android 开发的世界中,有一些组件,无论应用层技术再怎么迭代,作为根底反对,它们仍然在那里。比方当咱们提到网络库时,总会下意识想到一个名字,即 OkHttp 。 只管对于大多数开发者而言,通常状况下应用的是往往它的封装版本 Retrofit ,不过其底层仍然离不开 Okhttp 作为根底撑持。而无论是自研网络库的二次封装,还是集体应用,OkHttp 也往往都是不二之选。 故本篇将以最新视角开始,使劲一瞥 OkHttp 的设计魅力。 本文对应的 OkHttp 版本: 4.10.0 本篇定位 中高难度,将从背景到应用形式,再到设计思维与源码解析,尽可能全面、易懂。背景每一个技术都有其变迁的历史背景与个性,本大节,咱们将聊一聊 Android网络库 的迭代史,作为开篇引语,润润眼。 对于 Android网络库 的迭代历史,如下图所示: 具体停顿如下: HttpClient Android1.0 时推出。但存在诸多问题,比方内存透露,频繁的GC等。5.0后,已被弃用; HttpURLConnection Android2.2 时推出,比 HttpClient 更快更稳固,Android4.4 之后底层曾经被 Okhttp 代替; volley Google 2013年开源,基于 HttpURLConnection 的封装,具备良好的扩展性和适用性,不过对于简单申请或者大量网络申请时,性能较差。目前仍然有不少我的项目应用(通常是老代码的保护); okhttp Square 2013年开源,基于 原生Http 的底层设计,具备 疾速 、 稳固 、节俭资源 等特点。是目前诸多热门网络申请库的底层实现,比方 Retrofit、RxHttp 等; Retrofit Square 2013年开源,基于 OkHttp 的封装,目前 支流 的网络申请库。 通过注解形式配置网络申请、REST格调 api、解耦彻底、常常会搭配 Rx等 实现 框架联动; …上述的整个过程,也正是随同了 Android 开发的各个期间,如果将上述分为 5个阶段 的话,那么则为: ...

February 13, 2023 · 4 min · jiezi

关于okhttp:OkHttp请求耗时统计

目录介绍01.先发问一个问题02.EventListener回调原理03.申请开始完结监听04.dns解析开始完结监听05.连贯开始完结监听06.TLS连贯开始完结监听07.连贯绑定和开释监听08.request申请监听09.response响应监听10.如何监听统计耗时11.利用实际之案例01.先发问一个问题OkHttp如何进行各个申请环节的耗时统计呢? OkHttp 版本提供了EventListener接口,能够让调用者接管一系列网络申请过程中的事件,例如DNS解析、TSL/SSL连贯、Response接管等。通过继承此接口,调用者能够监督整个利用中网络申请次数、流量大小、耗时(比方dns解析工夫,申请工夫,响应工夫等等)状况。02.EventListener回调原理先来看一下 public abstract class EventListener { // 依照申请程序回调 public void callStart(Call call) {} // 域名解析 public void dnsStart(Call call, String domainName) {} public void dnsEnd(Call call, String domainName, List<InetAddress> inetAddressList) {} // 开释以后Transmitter的RealConnection public void connectionReleased(Call call, Connection connection) {} public void connectionAcquired(call, result){}; // 开始连贯 public void connectStart(call, route.socketAddress(), proxy){} // 申请 public void requestHeadersStart(@NotNull Call call){} public void requestHeadersEnd(@NotNull Call call, @NotNull Request request) {} // 响应 public void requestBodyStart(@NotNull Call call) {} public void requestBodyEnd(@NotNull Call call, long byteCount) {} // 完结 public void callEnd(Call call) {} // 失败 public void callFailed(Call call, IOException ioe) {}}03.申请开始完结监听callStart(Call call) 申请开始 ...

September 23, 2020 · 8 min · jiezi

关于okhttp:OKHttp一基础使用

OkHttp(一)1 简介 OkHttp是现今一个较为出众的网络通信库,能够代替原生的HTTPURLConnection,反对Http/SPDY,有着简略易用,拓展性好等长处。 2 HttpURLConnecti让咱们先看看未应用OkHttp要怎么实现网络申请。 在未应用框架前,咱们基本上会应用原生的HttpClient(已淘汰)和HttpURLConnection来进行发送HTTP申请。 HttpURLConnection是一种多用途、轻量级的HTTP客户端,咱们大部分的应用程序能够应用它来进行HTTP操作。接下来简略应用其来发送一个Get办法的Http申请。 留神以下操作都是在子线程下进行的 (1)获取HttpURLConnection的实例// 用URL对象来创立HttpURLConnection URL murl = new URL("https://www.baidu.com"); HttpURLConnection connection = (HttpURLConnection)murl.openConnection;// 设置参数(超时工夫,读取超时,申请办法,header等 connection.setConnectionTimeout(8888); connection.setRequestMethod("GET"); ...// POST申请还要将参数写入到输入流中(2)连贯并获取输出流,并对其解决 connection.connect(); mInputSteam = connection.getInputSteam(); // 可选 int code = mHttpURLConnection.getResponseCode(); String respose = converStreamToString(mInputStream); Log.i("baidu", "申请状态码:" + code + "\n申请后果:\n" + respose);` //依据理论状况,来判断如何解决流数据 mInputSteam.close();(3)敞开连贯 connection.disconnect();以上就是HttpURLConnection的一个基本操作。 3 OkHttp的应用3.1 Get申请 //建造者模式构建对象 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .get() .url("https://www.4399.com") .build(); Call call = client.newCall(request); try { //1.同步申请调用的办法是call.execute(),外部采纳的是线程阻塞(始终期待直到线程返回后果)形式间接将后果返回到Response Response response = call.execute(); //2.异步申请调用的办法是call.enqueue(Callback callback),该办法须要传入一个Callback期待后果回调的接口 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.w("cozing", "申请失败"); } @Override public void onResponse(Call call, Response response) throws IOException { //在这里解决失去的Response Log.w("cozing", "申请胜利"); } });} catch (IOException e) { e.printStackTrace();} 3.2 Post申请 OkHttpClient client = new OkHttpClient(); // 将参数结构成表单对象 FormBody formBody = new FormBody.Builder() .add("username", "admin") .add("password", "admin") .build(); Request request = new Request.Builder() .post(formBody) .url("https://www.4399.com") .build(); Call call = client.newCall(request); try { Response response = call.execute(); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.w("cozing", "申请失败"); } @Override public void onResponse(Call call, Response response) throws IOException { //在这里解决失去的Response Log.w("cozing", "申请胜利"); } });} catch (IOException e) { e.printStackTrace();} 以上就是OkHttp的一个根本应用,咱们不难看出因为其对网络申请性能进行了封装,使得整体的代码变得更加的简洁明了。 ...

July 29, 2020 · 1 min · jiezi