鸿蒙网络请求
网络请求的一些概念
超文本传输协议(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,就需要自己实现这三个文件,当然网上也有别人写好了的,大家可以自己去搜一下。