【关键字】服务卡片、元服务、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;
}定时刷新和点击触发刷新同理,就不再赘述了。