okhttp+“图灵机器人API” 实现智能聊天

来源:互联网 发布:js实现格式化html代码 编辑:程序博客网 时间:2024/04/30 07:20

看这篇文章之前,我们可以先看看效果图:
这里写图片描述
我们这篇文章的重点在于数据的请求,界面的实现可以查看我之前的一篇文章类似QQ聊天界面
然后开始我们的正题,我们的思路很简单:将我们的问题发送给图灵机器人的服务器,服务器返回给我们数据,然后解析显示。这里我们的数据请求和数据解析都交给okhttp这个开源网络请求框架,这里是github地址。

  1. okhttp的优点,即我们为什么使用okhttp
  • 支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据
  • 如果HTTP/2不可用, 连接池复用技术也可以极大减少延时
  • 支持GZIP, 可以压缩下载体积
  • 响应缓存可以直接避免重复请求
  • 会从很多常用的连接问题中自动恢复
  • 如果您的服务器配置了多个IP地址, 当第一个IP连接失败的时候, OkHttp会自动尝试下一个IP
  • OkHttp还处理了代理服务器问题和SSL握手失败问题

当然你也可以使用HttpUrlConnection和HttpClient,但是这里我更喜欢使用okhttp。
要使用图灵机器人我们需要注册他的账号,获得开发者的key,注册这里就不讲了,我是用于测试的免费版,功能也很完整了,一天5000次的免费请求也是足够了。
然后我们查看api的介绍发现,它官方鼓励使用post的方式请求数据,所以这里我们用okhttp自己封装一个方法,方便我们之后的请求:

/***   * post请求数据   * @param url 请求地址   * @param keys 请求参数的key值数组   * @param values 请求参数的key对应的value数组   * @return 返回请求结果   * @throws IOException   */public String sendPost(String url, String[] keys, String[] values) throws IOException {        //第一步        client = new OkHttpClient();        //第二步        FormBody.Builder builder = new FormBody.Builder();        //拼接请求体,和get方式的区别就在这里        for (int i = 0; i < keys.length; i++) {            builder.add(keys[i], values[i]);        }        RequestBody body = builder.build();        Request request = new Request.Builder()                .url(url)                .post(body)                .build();        /*Call call = client.newCall(request);        //第三步        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                Log.e("Exception", e.toString());            }            @Override            public void onResponse(Call call, Response response) throws IOException {                strResponse = response.body().string();                Log.i("result", strResponse);            }        });*/        Response response = client.newCall(request).execute();        if (!response.isSuccessful()) {            throw new IOException();        }        strResponse = response.body().string();        return strResponse;    }

你可以看见上面我注销了一段代码,因为我在测试的时候发现它返回的JSON结果一直为空,一直找不到原因,后来想明白过来,这个请求成功的回调方法onResponse是在一个新的线程中执行的,是一个异步操作,所以如果用这种方式,还没获取到值就已经返回null值了。所以我们改用同步请求,能够及时获取返回值,但这样我们就必须自己另起一个新的线程来执行。
像如下代码一样,请求参数已经初始化了,具体参数可以看图灵机器人官方文档,很详细:

new Thread() {            @Override            public void run() {                try {                    text = new HttpUtils().sendPost("http://tuling123.com/openapi/api", keys, values);                    readJSON(text);//解析JSON字符串,获得想要的数据                    list.add(new Msg(text, 1));                    if (url != null) {                        list.add(new Msg(url, 1));                    }                } catch (IOException e) {                    Log.e("IOException", e.toString());                }                handler.sendEmptyMessage(0);            }        }.start();
public void readJSON(String strJson) {        Log.i("strJson", strJson);        JSONObject jsonObject;        try {            jsonObject = new JSONObject(strJson);            text = jsonObject.getString("text");            url = jsonObject.getString("url");        } catch (JSONException e) {            url = null;            e.printStackTrace();        }    }

获取到机器人返回给我们的答案之后,用handler更新一下我们的聊天界面:

Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            switch(msg.what) {                case 0:                    chatAdapter.notifyItemInserted(chatAdapter.getItemCount() - 1);                    rvChat.smoothScrollToPosition(chatAdapter.getItemCount() - 1);                    break;            }        }    };

好了,简单的智能聊天就讲到这里,感兴趣的可以看下我放在github上的源码,戳这里—>

1 0
原创粉丝点击