鸿蒙(HarmonyOS)版Retrofit网络请求框架_harmony的网络请求框架(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

}

JianJia jianJia = new JianJia.Builder()
.baseUrl(“https://www.wanandroid.com”)
.addConverterFactory(GsonConverterFactory.create())
.build();

Wan wan = jianJia.create(Wan.class);
wan.getBanner().enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
try {
if (response.isSuccessful()) {
// json已经被解析成banner对象了
Banner banner = response.body();
}
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void onFailure(Call call, Throwable t) {
LogUtils.info(“yunfei”, t.getMessage());
}
});

四、示例代码效果

在源码的entry目录下提供了示例代码,代码运行结果请查看上图。 上图显示的一个网页上的内容,端上使用蒹葭网络库访问该网站提供的接口来 获取首页的文章列表,当请求成功后,将文章列表显示在页面上。 目前只获取了第一页的文章列表,有兴趣的同学可以自行实现分页加载。 demo刚运行的时候页面白屏,那是因为此时正在请求网络,正常情况下,应当加个进度条, 只不过示例中没有进度条。在运行示例代码时,如果在安装的时候出现INSTALL_PARSE_FAILED_USESDK_ERROR, 请把config.json文件中的"releaseType": "Beta1"删除。

五、示例代码讲解

5、1 在示例代码中的com.poetry.jianjia.net包下面创建了如下的接口,把所有的请求放在一个接口里面即可, 没必要创建多个接口类。

/**

  • @author 裴云飞
  • @date 2021/1/23
    */
    public interface Wan {

@GET(“article/list/{page}/json”)
Call getArticle(@Path(“page”) int page);

@GET(“article/list/{page}/json”)
Call

getHomeArticle(@Path(“page”) int page);

@GET()
Call getArticle(@Url String url);

@GET(“wxarticle/list/405/1/json”)
Call search(@Query(“k”) String k);

@GET(“wxarticle/list/405/1/json”)
Call search(@Query(“k”) String… k);

@GET(“wxarticle/list/405/1/json”)
Call search(@Query(“k”) List k);

@GET(“wxarticle/list/405/1/json”)
Call search(@QueryMap Map<String, String> param);

@GET(“article/list/0/json”)
Call getArticle(@QueryMap Map<String, String> param);

@BaseUrl(“https://api.apiopen.top”)
@GET(“getJoke”)
Call getJoke(@QueryMap Map<String, String> param);

@POST(“user/login”)
@FormUrlEncoded
Call login(@Field(“username”) String username, @Field(“password”) String password);

@POST(“user/login”)
@FormUrlEncoded
Call login(@FieldMap Map<String, String> map);

@GET(“banner/json”)
Call getBanner();
}

5、2 创建jianjia对象,整个项目只需一个jianjia对象即可,如何确保只有一个 jianjia对象?当代码运行起来后,首先会创建AbilityPackage对象, 调用AbilityPackageonInitialize方法,AbilityPackage执行完成后 才会启动AbilityAbilityPackage就是一个全局的单例,所以在 AbilityPackage里面创建的对象就是一个单例对象。只需在AbilityPackage 里面创建jianjia对象,就能确保整个项目只有一个jianjia对象。 AbilityPackage这个类不需要手动创建,在创建的项目的时候, 编译器会自动创建一个继承于AbilityPackage的类。

public class BaseApplication extends AbilityPackage {

private static BaseApplication instance;

private JianJia mJianJia;
private Wan mWan;

public static BaseApplication getInstance() {
return instance;
}

/**

  • 获取全局的蒹葭对象
  • @return 全局的蒹葭对象
    */
    public JianJia getJianJia() {
    return mJianJia;
    }

/**

  • 获取全局的接口实例对象
  • @return 全局的接口实例对象
    */
    public Wan getWan() {
    return mWan;
    }

@Override
public void onInitialize() {
super.onInitialize();
instance = this;
// 创建全局的蒹葭对象
mJianJia = new JianJia.Builder()
.baseUrl(“https://www.wanandroid.com”)
.addConverterFactory(GsonConverterFactory.create())
.build();
mWan = mJianJia.create(Wan.class);
}
}

如上代码,BaseApplication继承AbilityPackage,在onInitialize 方法创建全局的蒹葭对象。同时,整个项目只创建了一个接口类,所以可以在创建完蒹葭对象后 直接调用蒹葭的create方法来创建接口的实例对象。其它地方只需要通过下面的方式即可获取蒹葭对象和接口实例对象。

// 获取全局的蒹葭对象
BaseApplication.getInstance().getJianJia();
// 获取全局的接口实例对象
BaseApplication.getInstance().getWan();

5、3 在MainAbilitySlice里面添加ListContainer,关于ListContainer的用法,请查看  官方文档 ,这里不过多介绍了。接着调用getHomeArticle方法请求服务器,getHomeArticle方法会获取在AbilityPackage里面创建在接口实例对象来执行网络请求, 请求成功后调用setHomeArticle方法来刷新页面。

public class MainAbilitySlice extends AbilitySlice {

private ListContainer mListContainer;
private HomeArticleProvider mHomeArticleProvider;
List<Article.Data.Datas> mDatas;

@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
mListContainer = (ListContainer) findComponentById(ResourceTable.Id_list);
mDatas = new ArrayList<>();
mHomeArticleProvider = new HomeArticleProvider(this, mDatas);
mListContainer.setItemProvider(mHomeArticleProvider);
// 从服务端获取数据
getHomeArticle();
}

/**

  • 从服务端获取数据
    */
    public void getHomeArticle() {
    BaseApplication.getInstance().getWan().getHomeArticle(0).enqueue(new Callback
    () {
    @Override
    public void onResponse(Call
    call, Response
    response) {
    if (response.isSuccessful()) {
    // 请求成功
    setHomeArticle(response.body());
    }
    }

@Override
public void onFailure(Call

call, Throwable t) {
// 请求失败
LogUtils.info(“yunfei”, t.getMessage());
}
});
}

@Override
public void onActive() {
super.onActive();
}

@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}

public void setHomeArticle(Article article) {
if (article == null || article.data == null || article.data.datas == null) {
return;
}
mDatas.addAll(article.data.datas);
// 刷新列表
mHomeArticleProvider.notifyDataChanged();
}

}

5、4 解决转义字符问题。如果服务端返回的json有特殊字符,比如中文的双引号。 gson在解析的时候会对特殊字符进行转义,这时就需要将转义后的字符串进行反转义。如下图所示

如何将转义后的字符串进行反转义?commons-lang这个库可以将转义后的字符串进行反转义 在build.gradle文件添加下的依赖

// commons-lang可以对特殊字符进行转义和反转义
implementation ‘commons-lang:commons-lang:2.6’

调用StringEscapeUtilsunescapeHtml方法,如果字符串中没有转义字符,unescapeHtml方法 会直接返回原字符串,否则会对字符串进行反转义。具体的代码可查看示例代码中的HomeArticleProvider类。

// json里面有一些特殊符号,特殊符号会被gson转义,
// StringEscapeUtils可以对转义的字符串进行反转义
String title = StringEscapeUtils.unescapeHtml(data.title);
componentHolder.title.setText(title);

反转义之后,特殊字符正常显示

六、获取请求和响应日志

6、1 可以通过charles、fiddler等抓包工具来查看到完整的请求和响应信息。关于抓包,可以自行搜索相关文章。
6、2 使用拦截器打印日志,添加下面的依赖

implementation ‘com.squareup.okhttp3:logging-interceptor:3.7.0’

给OkHttp添加拦截器。

// 创建日志拦截器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
// 为OKHTTP添加日志拦截器
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();
// 创建全局的蒹葭对象
mJianJia = new JianJia.Builder()
// 使用自定义的okHttpClient对象
.callFactory(okHttpClient)
.baseUrl(“https://www.wanandroid.com”)
.addConverterFactory(GsonConverterFactory.create())
.build();
mWan = mJianJia.create(Wan.class);

经过上面的配置,就可以打印日志了

七、混淆

如果项目开启了混淆,请在proguard-rules.pro添加如下的代码。关于混淆,可以查看 鸿蒙代码配置混淆

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-dontwarn javax.annotation.**
-keepattributes Signature, InnerClasses, EnclosingMethod, Exceptions

蒹葭

-dontwarn poetry.jianjia.**
-keep class poetry.jianjia.** { ; }
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@poetry.jianjia.http.
;
}

OkHttp3

-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.{*;}
-dontwarn okio.

gson

-keep class sun.misc.Unsafe { ; }
-keep class com.google.gson.stream.
* { *; }
-keepattributes Annotation
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

在我的示例代码中,com.poetry.jianjia.bean这个包下面的类实现了Serialized接口,

实现了Serialized接口的类不能被混淆,请把com.poetry.jianjia.bean这个包名替换成你自己的包名

-keep class com.poetry.jianjia.bean.**{*;}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

现了Serialized接口的类不能被混淆,请把com.poetry.jianjia.bean这个包名替换成你自己的包名
-keep class com.poetry.jianjia.bean.**{*;}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-kNkFCUlp-1713683371889)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值