鸿蒙网络请求(原生+zzr+OkHttp+Retrofit)

网络请求的一些概念

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,是目前在WWW中应用最广的协议。
HTTP常用的请求方式是GET和POST。
GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连。
POST请求的参数不是放在URL字符串里面,而是放在HTTP请求的正文内,请求的参数被封装起来以流的形式发送给服务端。

鸿蒙网络请求

基础配置

1、添加网络访问权限
在config.json文件中的module中添加网络访问权限

"reqPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]

在这里插入图片描述
2、设置访问模式
鸿蒙的默认是https访问模式,如果需要请求的网址是http开头的,需要在config.json文件中的deviceConfig下添加配置,如果需要请求的网址是https链接则可以不做这个配置。

  "deviceConfig": {
    "default": {
      "network": {
        "cleartextTraffic": true
      }
    }
  },

在这里插入图片描述
deviceConfig包含在具体设备上的应用配置信息,可以包含default、phone、tv等,default标签内的配置是适用于所有设备通用。network表示网络安全性配置,该标签允许应用通过配置文件的安全声明来自定义其网络安全,无需修改应用代码。cleartextTraffic表示是否允许应用使用明文网络流量(例如,明文HTTP),true是允许应用使用明文流量的请求,可缺省,缺省为false。
network对象的内部结构除了cleartextTraffic,还有securityConfig。securityConfig表示应用的网络安全配置信息。具体可以在官方文档-配置文件的元素搜索securityConfig查看具体设置。
P S:试一试
访问http://www.baidu.com,不做配置
在这里插入图片描述
访问https://www.baidu.com,不做配置
在这里插入图片描述
访问http://www.baidu.com,做配置
在这里插入图片描述
访问https://www.baidu.com,做配置
在这里插入图片描述

网络请求

原生网络请求HttpURLConnection

HttpURLConnection是Android HTTP请求方式
HttpURLConnection就是Java提供的发起HTTP请求的基础类库,提供了HTTP请求的基本能力,不过封装比较少,使用时都要自己设置,也需要自己处理请求流和响应流
鸿蒙也可以用HttpURLConnection

原生网络Get请求
    private void nativeGetNet(Component component) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = nativeHttpGet("http://www.baidu.com");
                HiLog.error(LABEL_LOG, "%{public}s", "原生网络GET请求网页返回结果:" + result);
            }
        }).start();
    }

    private String nativeHttpGet(String requestUrl) {
        StringBuilder sb = new StringBuilder();
        try {
            //创建一个URL对象,得到访问地址的URL
            URL url = new URL(requestUrl);
            //调用URL对象的openConnection()来获取HttpURLConnection对象实例,得到网络访问对象HttpURLConnection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //设置HTTP请求方式(请求使用的方法),GET或者POST,默认是GET
            connection.setRequestMethod("GET");
            //设置连接主机超时的毫秒数
            connection.setConnectTimeout(30 * 1000);
            //设置从主机读取数据超时的毫秒数
            connection.setReadTimeout(30 * 1000);
            //连接
            connection.connect();
            //得到响应状态码的返回值responseCode
            int code = connection.getResponseCode();
            if (code == HttpURLConnection.HTTP_OK) {//200正常响应
                //如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
                //调用getInputStream()方法获得服务器返回的输入流
                //对输入流进行读取,获取响应信息
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {//循环从流中读取
                    sb.append(line);
                }
                //关闭流
                reader.close();
            }
            //将HTTP连接关掉
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
        //返回响应结果
        return sb.toString();
    }

运行结果
在这里插入图片描述
在这里插入图片描述

原生网络Post请求
    private void nativePostNet(Component component) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = nativeHttpPost("http://www.baidu.com");
                HiLog.error(LABEL_LOG, "%{public}s", "原生网络POST请求网页返回结果:" + result);
            }
        }).start();
    }

    private String nativeHttpPost(String requestUrl) {
        StringBuilder sb = new StringBuilder();
        try {
            URL url = new URL(requestUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //设置请求方式、请求超时信息
            connection.setRequestMethod("POST");
            connection.setConnectTimeout(30 * 1000);
            connection.setReadTimeout(30 * 1000);
            //设置允许输出、读入
            //设置是否向httpUrlConnection输出,在POST请求中参数要放在http正文内,所以要设为true,默认情况下是false
            connection.setDoOutput(true);
            //设置是否从httpUrlConnection读入,默认情况下是true
            connection.setDoInput(true);
            //POST方法不能缓存,要手动设置为false
            connection.setUseCaches(false);
            //连接
            connection.connect();
            int code = connection.getResponseCode();
            if (code == HttpURLConnection.HTTP_OK) {//200正常响应
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {//循环从流中读取
                    sb.append(line);
                }
                reader.close();
            }
            //将HTTP连接关掉
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
        //返回响应结果
        return sb.toString();
    }

运行结果
在这里插入图片描述
在这里插入图片描述

ZZR封装的网络请求

配置

在build.gradle(:entry)里的dependencies加入

    //zzrhttp
    implementation 'com.zzrv5.zzrhttp:ZZRHttp:1.0.1'

在这里插入图片描述

使用
    private void zzrGetNet(Component component) {
        ZZRHttp.get("http://www.baidu.com", new ZZRCallBack.CallBackString() {
            @Override
            public void onFailure(int i, String s) {
                //http访问出错了,此部分内容在主线程中工作;
                //可以更新UI等操作,请不要执行阻塞操作。
            }

            @Override
            public void onResponse(String s) {
                //http访问成功,此部分内容在主线程中工作;
                //可以更新UI等操作,但请不要执行阻塞操作。
                HiLog.error(LABEL_LOG, "%{public}s", "zzr GET请求网页返回结果:" + s);
            }
        });
    }

运行结果
在这里插入图片描述
在这里插入图片描述

OkHttp网络请求

配置

在build.gradle(:entry)里的dependencies加入

    //okhttp3
    implementation 'com.squareup.okhttp3:okhttp:3.14.0'

在这里插入图片描述

使用
    private void okhttpGetNet(Component component) {
        OkHttpClient client = new OkHttpClient();
        //异步GET请求
        final Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .get()//默认就是GET请求,可以不写
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                HiLog.error(LABEL_LOG, "%{public}s", "OkHttp GET请求网页返回结果:" + response.body().string());
            }
        });
    }

运行结果
在这里插入图片描述
在这里插入图片描述

Retrofit网络请求

配置

在build.gradle(:entry)里的dependencies加入

    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    //Retrofit到Gson进行转换的库
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

在这里插入图片描述

使用

本次测试所用到的接口地址完整是
https://api.uomg.com/api/rand.qinghua
可以在浏览器访问并查看接口返回数据
在这里插入图片描述

创建接口地址
public class UrlConfig {

    private UrlConfig() {
    }

    /**
     * 接口路径
     */
    private static class BaseUrls {
        private static final String UOMG = "https://api.uomg.com/";
    }

    /**
     * 接口地址
     */
    public static final String BASE_URL = BaseUrls.UOMG;

}
创建Retrofit请求基础配置
/**
 * 接口管理器
 */
public class ApiServiceManager {

    private Retrofit mRetrofit;

    private static ApiServiceManager mInstance = new ApiServiceManager();

    public static ApiServiceManager get() {
        return mInstance;
    }

    private ApiServiceManager() {
        //创建Retrofit实例
        mRetrofit = new Retrofit.Builder()
                .baseUrl(UrlConfig.BASE_URL) //设置网络请求的Url地址
                .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器(支持Gson解析转换器)
                .client(getOkHttpClient())//OkHttpClient
                .build();
    }

    /**
     * 获取一个OkHttpClient
     */
    private OkHttpClient getOkHttpClient() {
        return new OkHttpClient.Builder()
                .connectTimeout(100, TimeUnit.SECONDS)//连接超时
                .writeTimeout(100, TimeUnit.SECONDS)//读取超时
                .readTimeout(100, TimeUnit.SECONDS)//写入超时
                .build();
    }

    /**
     * 创建对应的ApiService
     *
     * @param service 接口类
     */
    public <T> T create(final Class<T> service) {
        return mRetrofit.create(service);
    }

    /**
     * 获取Retrofit对象
     */
    public Retrofit getRetrofit() {
        return mRetrofit;
    }
}
创建数据返回后的Bean类

根据上文访问接口,看见了返回的数据,所以编写数据类如下

/**
 * 随机土味情话数据类
 */
public class QhBean {

    /**
     * 内容
     */
    public String content = "";
}
创建网络请求的接口
/**
 * 创建用于描述网络接口的类
 */
public interface ApiService {

    //获取随机土味情话
    @POST("api/rand.qinghua")
    Call<QhBean> getQhData();

}
请求网络
    private void retrofitGetNet(Component component) {
        ApiServiceManager.get().create(ApiService.class)
                .getQhData().enqueue(new retrofit2.Callback<QhBean>() {
            @Override
            public void onResponse(retrofit2.Call<QhBean> call, retrofit2.Response<QhBean> response) {
                HiLog.error(LABEL_LOG, "%{public}s", "retrofitGet请求网页返回结果:" + response.body().content);
            }

            @Override
            public void onFailure(retrofit2.Call<QhBean> call, Throwable throwable) {
                HiLog.error(LABEL_LOG, "%{public}s", "retrofitGet请求网页失败");
            }
        });
    }

运行结果
在这里插入图片描述
Retrofit的使用其实跟安卓里面差不多,如果安卓没使用过Retrofit的小伙伴看鸿蒙的Retrofit可能会有点吃力,可以参考本人的Android Retrofit网络请求框架文章
Retrofit+Rxjava在鸿蒙的使用其实跟安卓里面差不多,主要是鸿蒙并没有像安卓的这些文件
在这里插入图片描述
所以如果需要在鸿蒙上使用Retrofit+Rxjava,就需要自己实现这三个文件,当然网上也有别人写好了的,大家可以自己去搜一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值