【HarmonyOS】元服务服务卡片网络开发

【关键字】服务卡片、元服务、API6、网络请求、图片加载

一、API6服务卡片Java代码中如何进行网络请求?

API6服务卡片基于FormAbility,一般元服务默认工程中的FormAbility就是MainAbility。由于FormAbility是Java语言编写的,可以使okhttp进行网络请求相关的开发。

1、添加依赖:

首先在entry的build.gradle中添加如下依赖:

javascript 复制代码
dependencies {

    implementation 'com.squareup.okhttp3:okhttp:3.14.9'

}

Okhttp相关的使用可以参考Okhttp官网文档,链接如下:Overview - OkHttp (square.github.io)

2、使用方法,这边以Get请求为例,说明一下Okhttp的简单用法:

初始化OkhttpClient和request:

javascript 复制代码
OkHttpClient okHttpClient = new OkHttpClient();

Request request = new Request.Builder()

        .url(url)//请求地址

        .get()//Get方式请求

        .build();

a、同步请求:

javascript 复制代码
try {

    Response response=okHttpClient.newCall(request).execute();

    if(response.isSuccessful()){

        HiLog.info(TAG,"response success "+response.body().string());

        response.close();

    }

} catch (IOException e) {

    throw new RuntimeException(e);

}

b、异步请求:

javascript 复制代码
okHttpClient.newCall(request).enqueue(new Callback() {

    @Override

    public void onFailure(Call call, IOException e) {

        e.printStackTrace();

    }



    @Override

    public void onResponse(Call call, Response response) throws IOException {

        try{

            if (response.isSuccessful()) {

                HiLog.info(TAG,"response success "+response.body().string());

                response.close();

            }

        } catch (IOException e) {

             throw new IOException(e);

        }

    }

});

我们通过使用okhttputils工具类库可以进一步简化请求代码:

Okhttputils使用说明:okhttputils: 对okhttp的封装类 (gitee.com)

依赖引用:

javascript 复制代码
dependencies {

   implementation 'io.openharmony.tpc.thirdlib:okhttputils:1.0.1'

}

同步请求:

javascript 复制代码
 Response response = OkHttpUtils
    .get()//
    .url(url)//
    .tag(this)//
    .build()//
    .execute();

异步请求:

javascript 复制代码
String url = "http://www.csdn.net/";
OkHttpUtils
    .get()
    .url(url)
    .addParams("username", "hyman")
    .addParams("password", "123")
    .build()
    .execute(new StringCallback()
	        {
	            @Override
	            public void onError(Request request, Exception e)
	            {
	                
	            }
	
	            @Override
	            public void onResponse(String response)
	            {
	
	            }
	        });

二、如何通过网络请求数据进行服务卡片初始化?

由于我们是FormAbility的onCreateForm中完成卡片的创建,下面以创建卡片为例,说明该如何完成网络数据创建卡片。

如官网的示例中我们需要在onCreateForm中创建ProviderFormInfo,所以我们可以将通过网络请求获取的数据传入FormBindingData中,完成卡片的的初始化。

需要注意的是,在初始化卡片的时候,需要使用的Okhttp进行同步请求,请求完成后将数据传入FormBindingData,以下代码使用OkHttpUtils编写,,封装一个getData方法返回FormBindingData对象:

javascript 复制代码
public FormBindingData getData(){

    try {

        Response response=OkHttpUtils.get().url("url").build().execute();

        String str=response.body().string();

        HiLog.info(TAG, "onCreateForm: body "+str);

        response.close();

        return  new FormBindingData(str);

    } catch (Exception e) {

        HiLog.info(TAG, "onCreateForm: Exception "+e.toString()+" "+e.getMessage());

    }

    return new FormBindingData();

}

也可以通过ZSONObject获取java bean后,创建FormBindingData对象,如下:

javascript 复制代码
public FormBindingData getData(){

    try {

        Response response=OkHttpUtils.get().url("url").build().execute();

        String str=response.body().string();

        HiLog.info(TAG, "onCreateForm: body "+str);

        response.close();

        HotData hotData=ZSONObject.stringToClass(str, HotData.class);//str转化为java对象

        ZSONObject zsonObject = new ZSONObject();

        zsonObject.put("data",hotData.getData());//获取对象中的字段,赋值给ZSONObject

        return new FormBindingData(zsonObject);//通过ZSONObject创建FormBindingData

    } catch (Exception e) {

        HiLog.info(TAG, "onCreateForm: Exception "+e.toString()+" "+e.getMessage());

    }

    return new FormBindingData();

}

创建FormBindingData后传入formInfo完成卡片初始化:

javascript 复制代码
ProviderFormInfo formInfo = new ProviderFormInfo();

formInfo.setJsBindingData(getData());

return formInfo;

三、如何在卡片触发事件和定时定点刷新时通过网络请求刷新卡片内容?

卡片的点击事件会在onTriggerFormEvent中触发,定时定点刷新需要在onUpdateform中完成,所有的更新卡片的操作都是通过updateForm(formId, formBindingData)方法完成的。所以,同样可以使用getData方法获取formBindingData后就可以进行卡片内容的刷新。

四、如何加载网络图片?

加载网络图片,官网是通过内存图片的方式进行加载的,参考链接如下:文档中心

同样我们可以使用okhttp获取网络图片的bytes内容,然后通过formBindingData.addImageData("xxx.png", bytes)的方式进行图片内容的绑定。

bytes数据可以用以下方法获取

javascript 复制代码
public byte[] getImageData(String url){

    byte[] bytes=null;

    try {

        Response response=OkHttpUtils.get().url(url).build().execute();

        if(response.isSuccessful()){

            if(response.body()!=null){

                bytes= response.body().bytes();

            }

            response.close();

            HiLog.info(TAG, "getImageData: success");

        }else{

            HiLog.info(TAG, "getImageData: failed");

        }

    } catch (IOException e) {

        throw new RuntimeException(e);

    }

    return bytes;

}

然后在onCreateForm中参考官网方法进行初始化:

javascript 复制代码
@Override

protected ProviderFormInfo onCreateForm(Intent intent) {

    HiLog.info(TAG, "onCreateForm");

    ZSONObject zsonObject = new ZSONObject();

    String image="logo"+System.currentTimeMillis()+".png";

    HiLog.info(TAG, "onCreateForm: image=" + image);

    zsonObject.put("imageSrc", "memory://"+image);

    FormBindingData formBindingData = new FormBindingData(zsonObject);

    ProviderFormInfo formInfo = new ProviderFormInfo();

    formBindingData.addImageData(image,getImageData("url"));

    formInfo.setJsBindingData(formBindingData);

    return formInfo;

}

定时刷新和点击触发刷新同理,就不再赘述了。

相关推荐
国科安芯42 分钟前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
lilian2332 小时前
Harmony os 技术实战|拼豆制图43:压缩字符矩阵上线前如何拦住错位图纸
开发语言·前端·华为·矩阵·harmonyos
少陽君2 小时前
用于InfiniBand网络的实时终端监控器——高速互连的htop
网络
贾伟康3 小时前
【中国方言题库|15】HarmonyOS ArkTS 本地状态持久化实战:让保存、删除和页面返回后的数据即时一致
harmonyos·arkts·数据持久化·appstorage·preferences
发量惊人的中年网工4 小时前
如何验证DDoS高防真的生效?从源站隐藏到正常访问的完整验收方法
运维·网络·数据库·ddos
GuoFeng.Wan5 小时前
深入理解经典蓝牙的L2CAP协议
网络
夜月yeyue5 小时前
SOME/IP-SD 服务发现故障
网络·单片机·网络协议·tcp/ip·安全·服务发现
程序员z75 小时前
深入理解 GMP 模型:Go 协程调度器的设计与调度场景全解析
服务器·网络·golang
stolentime5 小时前
OpenClaw 网络数据采集新手入门指南
网络·ai·ai编程
小白说大模型6 小时前
Codex 实战:用 AI 写运维脚本
大数据·运维·网络·人工智能·机器学习·prompt