鴻蒙開源三方組件--HttpClient組件 Kalle
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
背景
Kalle是一個HttpClient,它遵循Http標準協(xié)議,支持同步請求和異步請求。
特性
- 支持GET、HEAD、OPTIONS、TRACE、POST、PUT、PATCH、DELETE請求方法
- 表單的提交,如普通字符串表單、帶文件的表單(含多文件、大文件)
- 自定義RequestBody,如文件、字符串(JSON、XML、普通字符串)
- 支持SSL,默認不校驗證書,開發(fā)者可以自定義證書
- 9種緩存模式,默認使用AES算法為緩存數(shù)據(jù)加密
- 自動管理Cookie,遵循Http協(xié)議,與瀏覽器實現(xiàn)相同原理
- 在任何時候取消請求,如未開始、正在執(zhí)行時
- 全局反序列化轉(zhuǎn)換器,直接請求JavaBean
- 基于攔截器的智能重定向與智能重試
- 支持開發(fā)者添加攔截器,例如Log打印、登錄重試、參數(shù)簽名
- 網(wǎng)絡可用性緩存檢查法,連接層可動態(tài)替換,如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();
- }
- }
- });
上傳文件
- 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();
- }
- }
- });
下載文件
- 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));
如何使用
配置
如果需要,我們可以做一些個性化的配置,但是所有的配置項都不是必須的。
配置的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是一個完全獨立的網(wǎng)絡庫,它不限制任何實現(xiàn)Http協(xié)議底層連接庫,因此它允許開發(fā)者自行決定使用何種底層連接庫,比如URLConnection、OkHttp、HttpClient。為了減小編譯后Kalle的大小,Kalle默認提供了基于URLConnection的底層連接庫(因為URLConnction是Java默認自帶的),同時實現(xiàn)了基于OkHttp`的備用的底層連接庫,有興趣的開發(fā)者可以自行實現(xiàn)基于其它項目的底層連接庫。
Http請求
Http請求從請求方法上可以分為兩大類,我們把它們稱為Url類請求(UrlRequest)和Body類請求(BodyRequest),因為一類只可以是簡單的url,而另一類不僅僅可以是簡單的url,也可以使用流來發(fā)送自定義RequestBody。
Url類的請求方法:
- GET, HEAD, OPTIONS, TRACE
Body類的請求方法:
- POST, PUT, DELETE, PATCH
對于Url類請求,需要構(gòu)建UrlRequest,例如下面這段代碼構(gòu)建的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();
進度
進度監(jiān)聽一般用于Body類型的請求,一般用于表單文件上傳、PUSH自定義RequestBody等。
基于表單時我們可以監(jiān)聽某個文件的上傳進度,也可以監(jiān)聽整個表單的發(fā)送進度:
- 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.so、libfb.so、libyogacore.so
將其添加到要集成的libs文件夾內(nèi),在entity的gradle內(nèi)添加如下代碼。
方式一:
通過library生成har包,添加har包到libs文件夾內(nèi)。
在entry的gradle內(nèi)添加如下代碼:
- 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:相關(guān)資料
IDE官方下載地址:https://developer.harmonyos.com/cn/develop/deveco-studio
原組件GitBook地址:https://yanzhenjie.com/Kalle
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)