更多信息请访问:Harmonyos技术社区https://harmonyos.51cto.com,与华为官方共同建立系统上的网络请求框架其实是将Android的Retrofit移植到鸿蒙系统。我将Retrofit剑甲的鸿蒙版命名为。健家不仅可以实现Retrofit的功能,还可以提供一些Retrofit没有的功能。Retrofit不支持动态替换域名。国内的应用一般都有多个域名。健佳支持动态更换域名。二、源码源码博客地址想要看懂源码,需要具备以下技能。熟悉okhttp的常用用法;熟悉面向接口编程、反射、泛型、注解;熟悉构造函数模式、适配器模式、工厂模式、策略模式、静态代理、动态代理、责任链模式等设计模式。3.混淆如果项目启用了混淆,请在proguard-rules中添加如下代码.pro.混淆可以查看鸿蒙代码配置混淆-renamesourcefileattributeSourceFile-keepattributesSourceFile,LineNumberTable-dontwarnjavax.annotation.**-keeattributesSignature,InnerClasses,EnclosingMethod,Exceptions#茅芬-dontwarnpoetry.jianjia.**-keepclasspoetry.jianjia.**{*;}-keepattributesRuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations-keepclassmembers,allowshrinking,allowobfuscationinterface*{@poetry.jianjia.http.*;}#OkHttp3-dontwarnokhttp3.logging.**-keepclassokhttp3.internal.**{*;}-dontwarnokio。#gson-keepclasssun.misc.Unsafe{*;}-keepclasscom.google.gson.stream.**{*;}-keepattributes*Annotation*-keepclassmembersclass*implementsjava.io.Serializable{staticfinallongserialVersionUID;privatestaticfinaljava.io.ObjectStreamField[]serialPersistentFields;privatevoidwriteObject(java.io.ObjectOutputStream);privatevoidreadObject(java.io.ObjectInputStream);java.lang.ObjectwriteReplace();java.lang.ObjectreadResolve();}#在我的示例代码中,com.poetry.jianjia的类在.bean包下实现了Serialized接口,实现Serialized接口的#Classes不能混淆,请将包名com.poetry.jianjia.bean换成自己的包名-keepclasscom.poetry.jianjia.bean.**{*;}4.添加依赖4.1在项目根目录的build.gradle文件中添加mavenCentral()仓库,打开项目根目录的build.gradle文件,在build.gradle文件的repositories闭包下添加mavenCentral()buildscript{repositories{//添加maven中央仓库mavenCentral()maven{url'https://mirrors.huaweicloud.com/repository/maven/'}maven{url'https://developer.huawei.com/repo/'}maven{url'http://maven.aliyun.com/nexus/content/repositories/central/'}jcenter()}dependencies{classpath'com.huawei.ohos:hap:2.4.2.5'classpath'com.huawei.ohos:decctest:1.0.0.6'}}allprojects{repositories{//添加maven中央仓库mavenCentral()maven{url'https://mirrors.huaweicloud.com/repository/maven/'}maven{url'https://developer.huawei.com/repo/'}maven{url'http://maven.aliyun.com/nexus/content/repositories/central/'}jcenter()}}4.2打开入口目录下的build。在gradle文件中,在build.gradle文件的dependencies闭包下添加如下依赖//Jianjia的核心代码实现'io.gitee.zhongte:jianjia:1.0.0'//数据转换器,数据转换器使用Gson会帮我们解析json,我们不需要手动解析jsonimplementation'io.gitee.zhongte:converter-gson:1.0.0'implementation"com.google.code.gson:gson:2.8.2"//log拦截器,通过日志拦截器可以看到请求头、请求体、响应头、响应体实现'com.squareup.okhttp3:logging-interceptor:3.7.0'4、3添加如下权限ohos.permission。INTERNET到配置文件5.具体用法。使用方法与改造相同。Jianjia提供了一系列注释。在进行网络请求时,需要使用这些注解。5.1GET注解创建接口,方法中使用GET注解,GET注解用于标识这是一个GET请求。该方法的返回值为Call对象,泛型为ResponseBody。其实泛型也可以是具体的实体对象,后面会讲到。健佳是如何完成网络请求的呢?使用构造函数方式创建jianjia对象,baseUrl为域名,创建jianjia对象时必须指定域名。调用create方法生成接口实例,调用wan.getBanner().enqueue执行网络请求,请求成功回调onResponse方法,请求成功回调onFailure方法失败。publicinterfaceWan{@GET("banner/json")CallgetBanner();}JianJiajianJia=newJianJia.Builder().baseUrl("https://www.wanandroid.com").build();Wanwan=jianJia.create(Wan.class);wan.getBanner().enqueue(newCallback(){@OverridepublicvoidonResponse(Callcall,Responseresponse){try{Stringjson=response.body().string();}catch(IOExceptione){e.printStackTrace();}}@OverridepublicvoidonFailure(Callcall,Throwablet){LogUtils.info("yunfei",t.getMessage());}});5.2BaseUrl注解国内应用一般有多个域名,BaseUrl注解可以为一个接口设置一个单独的域名。publicinterfaceWan{@BaseUrl("https://api.apiopen.top")@GET("getJoke")CallgetJoke(@QueryMapMapparam);}5、3路径注解路径注解在path来替换下面方法定义中指定的参数值。可以看到我们定义了一个getArticle方法,它接收一个page参数,我们的@GET注解使用{page}来声明访问路径。这里可以使用{page}作为占位符,在实际操作中会通过。替换@Path("page")标记的参数。publicinterfaceWan{@GET("article/list/{page}/json")CallgetArticle(@Path("page")intpage);}5、4查询注解查询注解用于添加请求参数获取请求,Query注解修饰的参数类型可以是数组、集合、字符串等publicinterfaceWan{@GET("wxarticle/list/405/1/json")Callsearch(@Query("k")字符串);@GET("wxarticle/list/405/1/json")Callsearch(@Query("k")String...k);@GET("wxarticle/list/405/1/json")Callsearch(@Query("k")Listk);}5、5QueryMap注解QueryMap注解以map的形式添加查询参数,QueryMap注解修饰的参数类型必须是Map对象.publicinterfaceWan{@GET("wxarticle/list/405/1/json")Callsearch(@QueryMapMapparam);}5、6SkipCallbackExecutorAnnotation在鸿蒙系统上,简佳会默认server的response被回调到主线程。如果方法上使用了SkipCallbackExecutor注解,服务器的结果将不会回调到主线程。publicinterfaceWan{@SkipCallbackExecutor@GET("wxarticle/list/405/1/json")Callsearch(@QueryMapMapparam);}5、7FormUrlEncoded注解和Field注解FormUrlEncoded注解用于发送a对于表单请求,必须在方法的参数中添加Field注解,才能使用该注解。Field注解修饰的参数类型可以是数组、集合、字符串等。)Stringpassword);}5、8FormUrlEncoded注解和FieldMap注解有时form的参数会比较多。如果使用Field注解,该方法将有更多参数。这时候可以使用FieldMap注解。FieldMap注解以键值对的形式发送表单请求。如果FieldMap注解修饰的参数不是Map类型,会抛出异常。如果Map的键值对为空,也会抛出异常。publicinterfaceWan{@POST("user/login")@FormUrlEncodedCalllogin(@FieldMapMapma??p);}5、9BodyAnnotation服务器会要求客户端将json字符串作为请求体发送给服务端。此时可以使用Body注解定义的参数,直接传入一个实体类,在内部对实体进行序列化,将序列化后的结果作为请求体直接发送。如果Body注解修饰的参数类型为RequestBody对象,则调用方无需添加数据转换器,内部使用默认的数据转换器。如果Body注解修饰的参数类型不是RequestBody对象,而是具体的实体类,调用方需要自定义一个类,继承Converter.Factory。publicinterfaceWan{/***Body注解修饰的参数类型为RequestBody对象,则调用者无需添加数据转换器,内部会使用默认的数据转换器**@parambody*@return*/@POST("user/register")Callregister(@BodyRequestBodybody);/***Body注解修饰的参数类型不是RequestBody对象,而是具体的实体类,所以调用者需要自定义一个类和继承转换器。Factory**@paramuser*@return*/@POST("user/register")Callregister(@BodyUseruser);}5、10Url注解Url注解用于添加接口的完整地址。在Retrofit中,如果接口的域名与创建retrofit对象时指定的域名不同,那么就会使用Url注解来解决问题。在Jianjia中也可以使用Url注解来解决,但是Jianjia也提供了BaseUrl来解决这个问题。publicinterfaceWan{@GET()CallgetArticle(@UrlStringurl);}5、11Headers注解Headers注解是作用于方法的注解,用于添加一个或多个请求头。publicinterfaceWan{@Headers("Cache-Control:max-age=640000")@GET("/")CallgetArticle(@UrlStringurl);@Headers({"X-Foo:Bar","X-Ping:Pong"})@GET("/")CallgetArticle(@UrlStringurl);}5、12Header注解Header注解是作用于参数的注解,用于添加请求头。publicinterfaceWan{@GET()Callfoo(@Header("Accept-Language")Stringlang);}5、13HeaderMap注解HeaderMap注解是作用于参数的注解,以映射的形式添加请求头,map中每一项的key和value不能为空,否则会抛出异常。publicinterfaceWan{@GET("/search")Calllist(@HeaderMapMapheaders);}5、14当我们在添加数据转换器之前在接口中定义方法时,方法的返回值是CallObject,泛型是ResponseBody。这种情况下,服务器返回给终端的数据会在ResponseBody中,终端需要手动解析json,将json解析成实体类。其实我们不需要手动解析json,可以让gson帮我们解析json。健家支持添加数据转换器,创建对象时添加数据转换器,即添加gson。在onResponse方法中可以直接获取实体类对象,gson帮我们把json解析成实体对象。首先在build.gradle文件中添加数据转换器依赖。//数据转换器,数据转换器使用gson帮我们解析json,不需要我们手动解析jsonimplementation'io.gitee.zhongte:converter-gson:1.0.0'implementation"com.google.code.gson:gson:2.8.2"使用数据转换器publicinterfaceWan{@GET("banner/json")CallgetBanner();}JianJiajianJia=newJianJia.Builder().baseUrl("https://www.wanandroid.com").addConverterFactory(GsonConverterFactory.create()).build();Wanwan=jianJia.create(Wan.class);wan.getBanner().enqueue(newCallback(){@OverridepublicvoidonResponse(Call调用,Responseresponse){try{if(response.isSuccessful()){//json已经被解析成banner对象Bannerbanner=response.body();}}catch(IOExceptione){e.printStackTrace();}}@OverridepublicvoidonFailure(Callcall,Throwablet){LogUtils.info("yunfei",t.getMessage());}});同样,有兴趣的同学可以看看源码。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区