鸿蒙开源三方组件--HttpClient组件 Kalle,


想了解更多内容,请访问:

51CTO和华为官方战略合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

背景

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

特性

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

组件示例效果

请求列表信息

  1. Kalle.get(UrlConfig.GET_LIST) 
  2.                 .param("pageNum", PAGE_NUMBER) 
  3.                 .param("pageSize", PAGE_SIZE) 
  4.                 .tag(this) 
  5.                 .perform(new SimpleCallback<NewsWrapper>(this) { 
  6.                     @Override 
  7.                     public void onResponse(SimpleResponse<NewsWrapper, String> response) { 
  8.                         if (response.isSucceed()) { 
  9.                             NewsWrapper wrapper = response.succeed(); 
  10.                             mDataList = wrapper.getDataList(); 
  11.                             mPage = wrapper.getPage(); 
  12.                             ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_normal_list_container); 
  13.                             MainItemProvider sampleItemProvider = new MainItemProvider(mDataList, NormalAbilitySlice.this); 
  14.                             listContainer.setItemProvider(sampleItemProvider); 
  15.                         } else { 
  16.                             new ToastDialog(NormalAbilitySlice.this) 
  17.                                     .setText(UrlConfig.GET_LIST + " response failed: " + response.failed()) 
  18.                                     .setAlignment(LayoutAlignment.CENTER) 
  19.                                     .show(); 
  20.                         } 
  21.                     } 
  22.                 }); 

上传文件

  1. Kalle.post(UrlConfig.UPLOAD_BODY_FILE) 
  2.                 .urlParam("filename", file.getName()) 
  3.                 .body(new FileBody(file)) 
  4.                 .tag(this) 
  5.                 .perform(new DialogCallback<BodyInfo>(this) { 
  6.                     @Override 
  7.                     public void onResponse(SimpleResponse<BodyInfo, String> response) { 
  8.                         if (response.isSucceed()) { 
  9.                             bodyItems = null; 
  10.                             statusBtn.setText(uploadResultStr); 
  11.                         } else { 
  12.                             new ToastDialog(BodyAbilitySlice.this) 
  13.                                     .setText("you clicked:" + response.failed()) 
  14.                                     .setAlignment(LayoutAlignment.CENTER) 
  15.                                     .show(); 
  16.                         } 
  17.                     } 
  18.                 }); 

下载文件

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

如何使用

配置

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

配置的Api如下:

  1. private void kalle() { 
  2.         Kalle.setConfig(KalleConfig.newBuilder() 
  3.                 .connectFactory(OkHttpConnectFactory.newBuilder().build()) 
  4.                 .cookieStore(DBCookieStore.newBuilder(this).build()) 
  5.                 .cacheStore(DiskCacheStore.newBuilder(AppConfig.get().PATH_APP_CACHE).build()) 
  6.                 .network(new BroadcastNetwork(this)) 
  7.                 .addInterceptor(new LoginInterceptor()) 
  8.                 .addInterceptor(new LoggerInterceptor("KalleSample", BuildConfig.DEBUG)) 
  9.                 .converter(new JsonConverter(this)) 
  10.                 .build()); 

连接

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

Http请求

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

Url类的请求方法:

  1. GET, HEAD, OPTIONS, TRACE 

Body类的请求方法:

  1. POST, PUT, DELETE, PATCH 

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

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

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

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

进度

进度监听一般用于Body类型的请求,一般用于表单文件上传、PUSH自定义RequestBody等。

基于表单时我们可以监听某个文件的上传进度,也可以监听整个表单的发送进度:

  1. FileBinary header = new FileBinary(new File("/sdcard/header.jpg")) 
  2.     .onProgress(new OnProgress<FileBinary>() { 
  3.         @Override 
  4.         public void progress(FileBinary origin, int progress) { 
  5.             // 文件1的进度:progress. 
  6.         } 
  7.     }); 
  8. FileBinary banner = new FileBinary(new File("/sdcard/banner.jpg")) 
  9.     .onProgress(new OnProgress<FileBinary>() { 
  10.         @Override 
  11.         public void progress(FileBinary origin, int progress) { 
  12.             // 文件2的进度:progress. 
  13.         } 
  14.     }); 
  15.  
  16. FormBody formBody = FormBody.newBuilder() 
  17.     .param("name", "kalle") 
  18.     .param("age", 18) 
  19.     .binary("header", header) 
  20.     .binary("banner", banner) 
  21.     .build(); 
  22. formBody.onProgress(new OnProgress<FormBody>() { 
  23.     @Override 
  24.     public void progress(FormBody origin, int progress) { 
  25.         // 整体进度:progress. 
  26.     } 
  27. }); 
  28.  
  29. Kalle.post(UrlConfig.UPLOAD_BODY_FILE) 
  30.     .urlParam("filename", "qq.apk") 
  31.     .body(formBody) 
  32.     .perform(...); 

集成方式

自行编译工程entity、yoga、yoga_layout、fb生成libyoga.so、libfb.so、libyogacore.so

将其添加到要集成的libs文件夹内,在entity的gradle内添加如下代码。

方式一:

通过library生成har包,添加har包到libs文件夹内。

在entry的gradle内添加如下代码:

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

方式二:

  1. allprojects{ 
  2.     repositories{ 
  3.         mavenCentral() 
  4.     } 
  5. implementation 'io.github.dzsf:kalle:1.0.0' 
  6. implementation 'io.github.dzsf:okalle:1.0.0' 

复制附录1:相关资料

IDE官方下载地址:https://developer.harmonyos.com/cn/develop/deveco-studio

原组件GitBook地址:https://yanzhenjie.com/Kalle

想了解更多内容,请访问:

51CTO和华为官方战略合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

相关内容