使用JAVA实现与图林机器人V2版的聊天小程序
在做微信人工客服的小程序时,需要调用图林来进行聊天,本来想使用jQuery和Ajax发送POST请求来实现的,但是在实现过程中涉及到了跨域的问题,经过一番折腾还没有解决跨域问题后,心灰意冷的我只能使用JAVA的JDK自带的方法去发送POST请求去进行实现并且成功了!!!特别满足~~
下面直接给出实现步骤:
- 步骤一: 先去图林网站注册一个账号,创建一个图林机器人,创建好后点击设置,会进入下图的界面:
注意:
(1)上图中的apikey是要填入代码的,每个人独有的;
(2)密钥选项不要勾选,如果勾选的话,上传数据时需要使用该密钥对数据进行加密,为了实现功能方便,就不进行加密了; - 步骤二:因为上传数据格式是JSON格式,所以需要导入JSONObject的jar包及其依赖的jar包
这里就不上传了,请读者自行下载; - 步骤三:在eclipse中新建工程,复制该代码。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class Tuling {
private static final String apikey ="这里填第一幅图中你获取的apikey";
//图林机器人的接口地址,在第一幅图最下面api使用文档中查看
private static final String URL = "http://openapi.tuling123.com/openapi/api/v2";
private static final String uid = "填你的用户名";
//向图林发送的消息
private static final String reqMes = "你是谁呢";
public static void main(String[] args) {
Tuling tl = new Tuling();
//获取发送信息的JSON数据
String reqJson = tl.getReqJson(reqMes);
//发送post请求,获取图林返回的JSON回复信息
String sendPost = tl.sendPost(URL, reqJson);
//JSONArray处理的字符串必须“[]”包含在
//对图林返回的JSON数据进行解析,取出回复结果
String resultMeg = tl.getResultMeg("["+sendPost+"]");
//System.out.println("reqJson: "+reqJson);
//System.out.println("sendPost: "+sendPost);
System.out.println("reqMes: "+reqMes);
System.out.println("resultMeg: "+resultMeg);
}
/**
* 将输入的信息转换为json对象
* @param reqMes
* @return
*/
public String getReqJson(String reqMes) {
//请求json
JSONObject reqJson = new JSONObject();
//输入类型
int reqType = 0;
//输入信息json,如文本,图片
JSONObject perception = new JSONObject();
//输入的信息
JSONObject inputText = new JSONObject();
inputText.put("text", reqMes);
perception.put("inputText",inputText);
//用户信息
JSONObject userInfo = new JSONObject();
userInfo.put("apiKey", apikey);
userInfo.put("userId", uid);
reqJson.put("reqType", reqType);
reqJson.put("perception", perception);
reqJson.put("userInfo", userInfo);
return reqJson.toString();
}
/**
* 发送请求
* @param url
* @param reqJson
* @return
*/
public String sendPost(String url, String reqJson) {
String status = "";
//回复的信息
String responseStr = "";
PrintWriter out = null;
BufferedReader in = null;
try {
URL realUrl = new URL(url);
//打开url连接
URLConnection urlCon = realUrl.openConnection();
HttpURLConnection httpUrlConnection = (HttpURLConnection) urlCon;
//设置请求属性
httpUrlConnection.setRequestProperty("Content-Type", "application/json");
httpUrlConnection.setRequestProperty("x-adviewrtb-version", "2.1");
//发送post请求必须设置一下两行
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setDoInput(true);
//获取URLConnection对象对应的输出流
out = new PrintWriter(httpUrlConnection.getOutputStream());
//发送请求参数
out.write(reqJson);
//flush输出流的缓冲
out.flush();
httpUrlConnection.connect();
//定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
String line = "";
while((line = in.readLine())!=null) {
responseStr += line;
}
status = new Integer(httpUrlConnection.getResponseCode()).toString();
httpUrlConnection.disconnect();
} catch (IOException e) {
System.out.println("发送post请求出现异常");
e.printStackTrace();
} finally {
try {
if(out != null) {
out.close();
}
if(in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return responseStr;
}
/**
* JSONObject将字符串转换为json,取到消息信息
* @param tulingStr
* @return
*/
public String getResultMeg(String tulingStr) {
JSONObject object = null;
String strResult = "";
JSONArray jsonArray = new JSONArray(tulingStr);
for(int i = 0; i < jsonArray.length(); i++) {
//System.out.println("jsonArray: " + jsonArray.getJSONObject(i));
object = jsonArray.getJSONObject(i);
strResult = object.getString("results");
//System.out.println("results: "+string);
}
JSONArray jsonArray1 = new JSONArray(strResult);
for(int i = 0; i < jsonArray1.length(); i++) {
//System.out.println("jsonArray1: " + jsonArray1.getJSONObject(i));
object = jsonArray1.getJSONObject(i);
strResult = object.getString("values");
//System.out.println("values: "+string);
}
JSONArray jsonArray2 = new JSONArray("["+strResult+"]");
for(int i = 0; i < jsonArray2.length(); i++) {
//System.out.println("jsonArray2: " + jsonArray2.getJSONObject(i));
object = jsonArray2.getJSONObject(i);
strResult = object.getString("text");
//System.out.println("text: "+string);
}
return strResult;
}
}
- 以上就是Java实现与图林机器人的聊天的代码,可以自行实现
- 注意:开头提到的跨域问题,可能图林机器人V2服务器端没有设置允许跨域的请求头有关,导致浏览器无法获取返回消息,使用图林机器人V1版就可以使用jQuery和Ajax进行聊天。
之后会结合上一篇文章和本文联合实现微信小程序的图林机器人聊天和百度AI的语音识别,敬请期待!!