一、基本格式
应用使用当前网络打开一个URL链接
会用到多线程操作,参看《线程管理开发指导-线程管理-Ability框架-开发-HarmonyOS应用开发》
布局
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:alignment="center"
ohos:orientation="vertical">
<Button
ohos:id="$+id:but1"
ohos:width="match_content"
ohos:height="match_content"
ohos:text="访问网络"
ohos:text_size="20vp"
ohos:background_element="lightblue"
/>
</DirectionalLayout>
package com.example.myapplication.slice;
import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.app.dispatcher.TaskDispatcher;
import ohos.app.dispatcher.task.TaskPriority;
import ohos.net.NetHandle;
import ohos.net.NetManager;
import ohos.net.NetStatusCallback;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
public class MainAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
Button but = findComponentById(ResourceTable.Id_but1);
but.setClickedListener(component -> {
//发送网络请求,但是我们不可以直接在onStart中进行网络访问
//否则程序启动时 ,会提示错误“不能在主线程中进行网络访问”
//因为不能在主线程中进行耗时的程序
//我们此处申请一个全局线程
//我们用一个线程去做,优先级我们设置为,默认任务优先级, 比低优先级的任务有更高的几率得到执行
TaskDispatcher globalTaskDispathcer = this.getGlobalTaskDispatcher(TaskPriority.DEFAULT);
//syncDispatch:同步调用
//asyncDispatch:异步调用
//此处写一个匿名方法
globalTaskDispathcer.asyncDispatch(()->{
//从官网复制
//获取网络管理的实例对象,实例就是此处的上下文(对象的环境、属性、定义等信息)
NetManager netManager = NetManager.getInstance(this);
if (!netManager.hasDefaultNet()) {//无网络则终止
return;
}
//获取默认的数据网络
NetHandle netHandle = netManager.getDefaultNet();
// 可以获取网络状态的变化,可以通过它来提示网络状态变化
//回调,意味着网络状态变化,自动执行
//重写,需要重写获取网络变化的
NetStatusCallback callback = new NetStatusCallback() {
// 重写需要获取的网络状态变化的override函数
};
//将回调函数设置
netManager.addDefaultNetStatusCallback(callback);
// 通过openConnection来获取URLConnection
HttpURLConnection connection = null;
try {
String urlString = "https://www.baidu.com"; // 开发者根据实际情况自定义EXAMPLE_URL
URL url = new URL(urlString);
//封装成网络对象,即封装成包
URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY);
if (urlConnection instanceof HttpURLConnection) {//判定是否有继承关系,即可以转换
connection = (HttpURLConnection) urlConnection;
connection.setRequestMethod("GET");//请求方式
connection.connect();//执行链接
// 之后可进行url的其他操作
//获取输入流,读取接口返回的数据
if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
//由于我们不知道后端会返回多少数据
InputStream is = connection.getInputStream();//创建输入流
StringBuilder builder = new StringBuilder();
byte[] bs = new byte[1024];//以字节形式存储数据,1024 B = 1 MB
int len = -1;
while((len = is.read(bs))!=-1 ){
builder.append(new String(bs,0,len));
}
String result = builder.toString();
System.out.println("______________________:"+result);
}
}
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
finally {
if (connection != null){
connection.disconnect();
}
}
});
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
注意
默认只能访问https接口,如果要访问config.json,我们需要在deviceConfig中添加如下代码
二、封装成方法
我们可以创建一个包,名字叫做util
在内中我们可以定义一个java类,叫做HttpRequestUtil
package com.example.myapplication.util;
import ohos.app.Context;
import ohos.net.NetHandle;
import ohos.net.NetManager;
import ohos.net.NetStatusCallback;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
public class HttpRequestUtil {
//上下文,网络路径(统一资源定位),请求方式(GET,POST,DELETE,PUT),请求参数(访问受限制资源时携带的token,非受限时用可null),请求体传递数据(当请求方式为PUT/POST时,要满足json格式)
public static String sendRequest(Context context,String urlString,String requestMethod,String token,String data){
String result = null;
System.out.println("------------------------开始建立数据包!\n");
NetManager netManager = NetManager.getInstance(context);
if (!netManager.hasDefaultNet()) {
return result;
}
NetHandle netHandle = netManager.getDefaultNet();
NetStatusCallback callback = new NetStatusCallback() {
};
netManager.addDefaultNetStatusCallback(callback);
HttpURLConnection connection = null;
try {
URL url = new URL(urlString);
URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY);
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
connection.setRequestMethod(requestMethod);
//如果数据包不为空,且为两种请求方式之一
if(data!=null && ( "put".equalsIgnoreCase(requestMethod) || "post".equalsIgnoreCase(requestMethod))){
//允许通过此网络连接向服务器写数据
connection.setDoOutput(true);
//将内容指定为JSON格式,并以UTF-8字符编码进行编码,传给服务器("文本类型","json;编码格式")
connection.setRequestProperty("Content-Type","application/json;charset=utf-8");
}
//将token放入数据包中
if(token!=null){
connection.setRequestProperty("token", token);
}
System.out.println("------------------------正在建立连接!\n");
connection.connect();
//像服务器传递data中数据
if(data!=null && ( "put".equalsIgnoreCase(requestMethod) || "post".equalsIgnoreCase(requestMethod))){
byte[] bytes = data.getBytes(StandardCharsets.UTF_8);//将data中数据以字节格式存储
OutputStream os = connection.getOutputStream();//创建流
os.write(bytes);//通过字节流的形式写入
os.flush();//清空缓冲区
os.close();
}
if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
System.out.println("------------------------成功获取结果!\n");
InputStream is = connection.getInputStream();
StringBuilder builder = new StringBuilder();
byte[] bs = new byte[1024];
int len = -1;
while((len = is.read(bs))!=-1 ){
builder.append(new String(bs,0,len));
}
result = builder.toString();
}
}
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
finally {
if (connection != null){
connection.disconnect();
}
return result;
}
}
}
三、第三方依赖的引入
我们可以引入第三方依赖,来很方便的读写Json。找到build.gradle(entry下)
在此处给出依赖坐标即可
比如添加如下gson依赖
最后让gradle同步即可