接上篇,完成了环境检测。
上篇链接:https://blog.csdn.net/weixin_42127613/article/details/81869354
那么考虑怎么样根据关键词进行自动回复。
既然是根据关键词,那么必然有个地方存储关键词。本地存储的话,我们可以采用SQLite数据库。但是那样的话,就是单机版。一旦更换手机,原先设置的关键词就都没有了。要解决这个问题,就要考虑关键词存储到服务器上。
关键词存储在服务器上,就必须考虑一个身份验证问题;身份验证,就必然涉及到账号和登录问题;有登录,就必须有注册,还得有找回密码功能;要找回密码,就得有邮箱验证或者手机短信验证;手机短信还得去申请短信接口;
服务器端,得考虑用Windows平台的IIS,还是Linux上的Apache或Tomcat。还有数据库是用SQL Server还是MySQL。服务端开发,用ASP.NET、PHP、JSP获取其他的,得选一个。
想想这些,问题还真多啊。不过再多的问题,我们都得一个个去解决。
网络请求是第一步。APP端得先发起网络请求到服务器端,服务器返回后,处理返回后的数据。
本节要完成引入网络包,并能请求网络,接收网络返回数据。完成后,文件结构如下图所示。
网络请求有很多库,我们使用okhttp这个库。
1、gradle中加入引用。
//网络请求框架
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
2、网络请求方法,我们做成一个单例。因为okhttp的client,我们只需要创建一个即可。没必要每次请求,都创建一个客户端。
在util包中,新建类OkHttpUtils,作为单例,代码如下:
public class OkHttpUtils {
private static final long DEFAULT_READ_TIMEOUT_MILLIS = 15 * 1000;
private static final long DEFAULT_WRITE_TIMEOUT_MILLIS = 20 * 1000;
private static final long DEFAULT_CONNECT_TIMEOUT_MILLIS = 20 * 1000;
private static volatile OkHttpUtils sInstance;
private OkHttpClient mOkHttpClient;
private OkHttpUtils() {
mOkHttpClient = new OkHttpClient.Builder()
.readTimeout(DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
.writeTimeout(DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
.connectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
.build();
}
public static OkHttpUtils getInstance() {
if (sInstance == null) {
synchronized (OkHttpUtils.class) {
if (sInstance == null) {
sInstance = new OkHttpUtils();
}
}
}
return sInstance;
}
//单例获取OkHttpClient实例
public OkHttpClient getOkHttpClient() {
return mOkHttpClient;
}
}
3、添加网络请求封装类HttpRequest。一般我们在发起网络请求前,都会根据我们的数据格式,封装一些数据。比如加入session、token之类的,甚至是加密等。这些操作在每个请求前都会去做,所以我们也做成统一方法。
新建一个net包,在net包中新建HttpRequest类,添加get请求方法,进行测试。代码如下。
public final class HttpRequest {
//调试版接口
private String mServerUrlDebug = "http://www.baidu.com";
//正式版接口
private String mServerUrlRelease = "http://www.baidu.com";
//get方法获取数据
public String getData() {
Response response;
String strResponse;
//准备网络请求
OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();
Request request = new Request.Builder()
.url(mServerUrlDebug)
.build();
try {
response = client.newCall(request).execute();
if (!response.isSuccessful()) {
return "网络请求失败";
}
ResponseBody body = response.body();
if (body == null) {
return "网络请求返回body为空";
}
strResponse = body.string();
//解析返回的JSON字符串
} catch (IOException e) {
e.printStackTrace();
return "网络请求异常" + e.getMessage();
}
return strResponse;
}
}
4、在MainActivity中添加调用,进行测试。我们在onCreate方法中创建一个线程,进行网络请求。
因为网络请求必须在工作线程,不能在主线程,否则OKHTTP自身都会运行报错。onCreate方法方法代码如下。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 沉浸式状态栏
QMUIStatusBarHelper.translucent(this);
View root = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
ButterKnife.bind(this, root);
//初始化状态栏
initTopBar();
//设置view
setContentView(root);
//检测环境
AppInfo.getInstance().ValidateEnvironment(this);
//初始化QMUIGroupListView
initMainContentView();
new Thread(new Runnable() {
@Override
public void run() {
//请求网络
HttpRequest httpRequest = new HttpRequest();
String strResponse = httpRequest.getData();
Log.d(TAG, strResponse);
}
}).start();
}
现在测试运行看看。结果在网络请求时会报错,出现网络请求异常的错误。这个是没有加入权限。需要在AndroidManifest.xml文件中加入网络请求权限。
加入网络请求权限。
<!-- 网络权限申请 -->
<uses-permission android:name="android.permission.INTERNET" />
如下图所示
再次运行测试,可以看到请求百度网站成功,数据也成功的返回。
OK。到此为止,我们成功的引入了网络请求包OKHTTP,并且进行了get请求测试,成功的获取了数据。
后面,将会用网络请求功能,去实现登录注册等功能。
本地代码已提交GitHub:https://github.com/dalu2048/WeChatGenius