【全网首发】鸿蒙开源三方组件--HttpClient组件 Kalle 原创 精华

发布于 2021-7-27 12:59
浏览
2收藏

前言

基于安卓平台的HttpClient组件Kalle(https://github.com/yanzhenjie/Kalle
实现了鸿蒙化迁移和重构,代码已经开源到(https://gitee.com/openneusoft/kalle
欢迎各位下载使用并提出宝贵意见!

背景

Kalle是一个HttpClient,它遵循Http标准协议,支持同步请求和异步请求。

特性

  • 支持GET、HEAD、OPTIONS、TRACE、POST、PUT、PATCH、DELETE请求方法
  • 表单的提交,如普通字符串表单、带文件的表单(含多文件、大文件)
  • 自定义RequestBody,如文件、字符串(JSON、XML、普通字符串)
  • 支持SSL,默认不校验证书,开发者可以自定义证书
  • 9种缓存模式,默认使用AES算法为缓存数据加密
  • 自动管理Cookie,遵循Http协议,与浏览器实现相同原理
  • 在任何时候取消请求,如未开始、正在执行时
  • 全局反序列化转换器,直接请求JavaBean
  • 基于拦截器的智能重定向与智能重试
  • 支持开发者添加拦截器,例如Log打印、登录重试、参数签名
  • 网络可用性缓存检查法,连接层可动态替换,如URLConnection、OkHttp或者ApacheHttpClient

组件示例效果

请求列表信息

Kalle.get(UrlConfig.GET_LIST)
                .param("pageNum", PAGE_NUMBER)
                .param("pageSize", PAGE_SIZE)
                .tag(this)
                .perform(new SimpleCallback<NewsWrapper>(this) {
                    @Override
                    public void onResponse(SimpleResponse<NewsWrapper, String> response) {
                        if (response.isSucceed()) {
                            NewsWrapper wrapper = response.succeed();
                            mDataList = wrapper.getDataList();
                            mPage = wrapper.getPage();
                            ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_normal_list_container);
                            MainItemProvider sampleItemProvider = new MainItemProvider(mDataList, NormalAbilitySlice.this);
                            listContainer.setItemProvider(sampleItemProvider);
                        } else {
                            new ToastDialog(NormalAbilitySlice.this)
                                    .setText(UrlConfig.GET_LIST + " response failed: " + response.failed())
                                    .setAlignment(LayoutAlignment.CENTER)
                                    .show();
                        }
                    }
                });

【全网首发】鸿蒙开源三方组件--HttpClient组件 Kalle-开源基础软件社区

上传文件

Kalle.post(UrlConfig.UPLOAD_BODY_FILE)
                .urlParam("filename", file.getName())
                .body(new FileBody(file))
                .tag(this)
                .perform(new DialogCallback<BodyInfo>(this) {
                    @Override
                    public void onResponse(SimpleResponse<BodyInfo, String> response) {
                        if (response.isSucceed()) {
                            bodyItems = null;
                            statusBtn.setText(uploadResultStr);
                        } else {
                            new ToastDialog(BodyAbilitySlice.this)
                                    .setText("you clicked:" + response.failed())
                                    .setAlignment(LayoutAlignment.CENTER)
                                    .show();
                        }
                    }
                });

【全网首发】鸿蒙开源三方组件--HttpClient组件 Kalle-开源基础软件社区

下载文件

Kalle.Download.get(UrlConfig.DOWNLOAD)
                    .directory(AppConfig.get().PATH_APP_DOWNLOAD)
                    .fileName("sou.apk")
                    .onProgress(new Download.ProgressBar() {
                        @Override
                        public void onProgress(int progress, long byteCount, long speed) throws NotExistException, WrongTypeException, IOException {
                            BigDecimal bg = new BigDecimal(speed / BYTE_NUMBER / BYTE_NUMBER);
                            String speedText = bg.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();
                            String downloadSpeed = resourceManager.getElement(ResourceTable.String_download_speed).getString();
                            speedText = String.format(downloadSpeed, speedText);
                            viewSetProgress(progress, speedText);
                        }
                    })
                    .perform(new DownloadCallback1(this));

【全网首发】鸿蒙开源三方组件--HttpClient组件 Kalle-开源基础软件社区

如何使用

配置

如果需要,我们可以做一些个性化的配置,但是所有的配置项都不是必须的。
配置的Api如下:

private void kalle() {
        Kalle.setConfig(KalleConfig.newBuilder()
                .connectFactory(OkHttpConnectFactory.newBuilder().build())
                .cookieStore(DBCookieStore.newBuilder(this).build())
                .cacheStore(DiskCacheStore.newBuilder(AppConfig.get().PATH_APP_CACHE).build())
                .network(new BroadcastNetwork(this))
                .addInterceptor(new LoginInterceptor())
                .addInterceptor(new LoggerInterceptor("KalleSample", BuildConfig.DEBUG))
                .converter(new JsonConverter(this))
                .build());
}

连接

Kalle是一个完全独立的网络库,它不限制任何实现Http协议底层连接库,因此它允许开发者自行决定使用何种底层连接库,比如URLConnection、OkHttp、HttpClient。为了减小编译后Kalle的大小,Kalle默认提供了基于URLConnection的底层连接库(因为URLConnction是Java默认自带的),同时实现了基于OkHttp`的备用的底层连接库,有兴趣的开发者可以自行实现基于其它项目的底层连接库。

Http请求

Http请求从请求方法上可以分为两大类,我们把它们称为Url类请求(UrlRequest)和Body类请求(BodyRequest),因为一类只可以是简单的url,而另一类不仅仅可以是简单的url,也可以使用流来发送自定义RequestBody。

Url类的请求方法:

GET, HEAD, OPTIONS, TRACE

Body类的请求方法:

POST, PUT, DELETE, PATCH

对于Url类请求,需要构建UrlRequest,例如下面这段代码构建的UrlRequest,最终的url是http://www.example.com?name=kalle&password=123:

Url.Builder url = Url.newBuilder("http://www.example.com");
UrlRequest urlRequest = UrlRequest.newBuilder(url, RequestMethod.GET)
    .param("name", kalle)
    .param("password", 123)
    .build();

BodyRequest的用法和UrlRequest基本是完全一致的:

Url.Builder url = Url.newBuilder("http://www.example.com");
BodyRequest bodyRequest = BodyRequest.newBuilder(url, RequestMethod.GET)
    .param("name", kalle)
    .param("password", 123)
    .build();

进度

进度监听一般用于Body类型的请求,一般用于表单文件上传、PUSH自定义RequestBody等。
基于表单时我们可以监听某个文件的上传进度,也可以监听整个表单的发送进度:

FileBinary header = new FileBinary(new File("/sdcard/header.jpg"))
    .onProgress(new OnProgress<FileBinary>() {
        @Override
        public void progress(FileBinary origin, int progress) {
            // 文件1的进度:progress.
        }
    });
FileBinary banner = new FileBinary(new File("/sdcard/banner.jpg"))
    .onProgress(new OnProgress<FileBinary>() {
        @Override
        public void progress(FileBinary origin, int progress) {
            // 文件2的进度:progress.
        }
    });

FormBody formBody = FormBody.newBuilder()
    .param("name", "kalle")
    .param("age", 18)
    .binary("header", header)
    .binary("banner", banner)
    .build();
formBody.onProgress(new OnProgress<FormBody>() {
    @Override
    public void progress(FormBody origin, int progress) {
        // 整体进度:progress.
    }
});

Kalle.post(UrlConfig.UPLOAD_BODY_FILE)
    .urlParam("filename", "qq.apk")
    .body(formBody)
    .perform(...);

集成方式

自行编译工程entity、yoga、yoga_layout、fb生成libyoga.solibfb.solibyogacore.so
将其添加到要集成的libs文件夹内,在entity的gradle内添加如下代码。
方式一:
通过library生成har包,添加har包到libs文件夹内。
在entry的gradle内添加如下代码:

implementation fileTree(dir:'libs', include:['*.jar','*.har'])

方式二:

allprojects{
	repositories{
		mavenCentral()
	}
}
implementation 'io.github.dzsf:kalle:1.0.0'
implementation 'io.github.dzsf:okalle:1.0.0'

附录1:相关资料

IDE官方下载地址:https://developer.harmonyos.com/cn/develop/deveco-studio
原组件GitBook地址:https://yanzhenjie.com/Kalle

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-7-29 15:36:05修改
3
收藏 2
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐