编写微信聊天机器人9《聊天精灵WeChatGenius》:加入网络请求功能,使用OkHttp单例。

版权声明:允许转载,请注明来源。 https://blog.csdn.net/weixin_42127613/article/details/81872403

接上篇,完成了环境检测。

上篇链接: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

猜你喜欢

转载自blog.csdn.net/weixin_42127613/article/details/81872403