图灵机器人聊天应用之HTTP POST和JSON(附源码)

概述

平台概述:图灵机器人开放平台是北京光年无限科技旗下的个性化人工智能机器人开放平台。通过图灵机器人开放平台,软硬件产品开发者可快速为自己的产品接入一款具备个性化身份属性特征、满足不同场景多轮对话及上下文对话的人工智能机器人,实现产品的对话式交互。
注意:图灵机器人新注册的用户在未实名认证的前提下,一个机器人一天只能发10条消息(好吧,已经不太实用了,实名认证太麻烦了!),认证后增添为100条/天。

API接入

接入说明

根据官方的API接入文档,网址如下:
https://www.kancloud.cn/turing/www-tuling123-com/718227
编码方式:UTF-8(调用图灵API的各个环节的编码方式均为UTF-8)
接口地址:http://openapi.tuling123.com/openapi/api/v2
请求方式:HTTP POST
请求参数:请求参数格式为 json
官方教程给出的示例如下:

{
	"reqType":0, 
    "perception": {
        "inputText": {
            "text": "附近的酒店"
        },
        "inputImage": {
            "url": "imageUrl"
        },
        "selfInfo": {
            "location": {
                "city": "北京",
                "province": "北京",
                "street": "信息路"
            }
        }
    },
    "userInfo": {
        "apiKey": "",
        "userId": "" 
    }
}

只发送文本格式数据,除去默认和无关部分,简化如下:

{
    "perception": {
        "inputText": {
            "text": "你好"
        }
    },
    "userInfo": {
        "apiKey": "你的apiKey",
        "userId": "1" //用户唯一标识,demo只有一个用户,固定为1
    }
}

后续将说明如何得到该格式的JSON字符串。

HTTP POST请求

通过URL的构造方法传入图灵机器人的接口地址,设置请求方式为POST,建立连接,然后按照指定格式"utf-8"写入和读取数据流,防止乱码。

	URL	url = new URL("http://openapi.tuling123.com/openapi/api/v2");
	HttpURLConnection conn = (HttpURLConnection) url.openConnection();			
	conn.setRequestMethod("POST");
	conn.setDoOutput(true);
	conn.connect();
	//TODO:获得json格式字符串
	//往服务端口写数据
	if(json!= null) {
		OutputStream os = conn.getOutputStream();
		os.write(json.getBytes("utf-8"));
		os.close();
	}
	//读取服务端内容
	InputStream is = conn.getInputStream();
	InputStreamReader isr= new InputStreamReader(is,"utf-8");
	BufferedReader br = new BufferedReader(isr);
	StringBuffer buffer = new StringBuffer();
	String line;
	while((line=br.readLine())!= null) {
		buffer.append(line);
		}
	is.close();
	//TODO:解析json格式字符串

JSON字符串

Gson

为了得到json字符串,需要用到Gson:Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以实现 JSON 字符串和 Java对象之间的相互转换。
Gson中2个最基本的方法:参考地址
toJson() – 转换Java 对象到JSON
fromJson() – 转换JSON到Java对象
为了能更好的理解上面两个方法,举例进行说明:
1.首先创建一个Student类,用于实例化成转换的Java对象

public class Student {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

2.创建将Student对象转换为JSON字符串的方法

public static void tojson(Student student) {
        Gson gson = new Gson();
        String json = gson.toJson(student);
        System.out.println(json);
    }

3.创建将JSON字符串转换为Student对象的方法

public static void toStudent(String s) {
        Gson gson = new Gson();
        Student student = gson.fromJson(s, Student.class);
        System.out.println(student.getName());
        System.out.println(student.getAge());
    }

4.创建Student对象student,设置属性,调用toJson方法

  Student student = new Student();
        student.setName("小明");
        student.setAge("15");

        tojson(student);

结果为:{“name”:“小明”,“age”:“15”}
5.创建JSON字符串,调用toStudent方法,获得Student对象,输出其属性

  String json = "{'name':'小红','age':'18'}";
  toStudent(json);

结果为:小红/r/n18
这样就实现了简单的Java对象与JSON字符串之间的转换,现在分析我们需要转换的JSON字符串。

发送请求

将简化后的请求化成一行,得到需要构建的json字符串:
{“perception”:{“inputText”:{“text”:“你好”}},“userInfo”:{“apiKey”:“你的apiKey”,“userId”:“1”}}
请求实体的结构图如下所示,红色部分为最底层的,作为属性存在,其他的部分需要创建相应的类,并且里层的类将作为外层的属性使用,这样就可以通过Gson将请求实体对象转换为JSON字符串了。
注意:这里的类的名字必须严格按照官方给出的命名来!结构图
创建相应类的代码因为比较简单所以不贴在这里了,参考上面的例子就可以,感兴趣的朋友可以去看源码。回到HTTP POST请求这里,生成JSON字符串,然后将其输出到服务端。

	inputText text = new inputText();
	text.setText(mytext);
	perception pp = new perception();
	pp.setInputText(text);
	userInfo user = new userInfo();
	user.setApiKey("你的apiKey");
	user.setUserId("1");//单人聊天无所谓
	/**获得json格式字符串*/
	reqEntity r = new reqEntity();
	r.setPerception(pp);
	r.setUserInfo(user);
	Gson gson = new Gson();
	String json = gson.toJson(r);

解析接收

首先看官方的API接入文档,下面是官方给出的输出示例:

 {
    "intent": {
        "code": 10005,
        "intentName": "",
        "actionName": "",
        "parameters": {
            "nearby_place": "酒店"
        }
    },
    "results": [
        {
         	"groupType": 1,
            "resultType": "url",
            "values": {
                "url": "http://m.elong.com/hotel/0101/nlist/#indate=2016-12-10&outdate=2016-12-11&keywords=%E4%BF%A1%E6%81%AF%E8%B7%AF"
            }
        },
        {
         	"groupType": 1,
            "resultType": "text",
            "values": {
                "text": "亲,已帮你找到相关酒店信息"
            }
        }
    ]
}

因为只发送文本,所以只关注results的values这一条就行了,因此需要构建一个接收实体对象用于被JSON字符串转换,然后提取其中values中的text中的文本即可。值得注意的是,results可能有多条,所以在最外部的respEntity中需要使用泛型为results的List作为成员变量。
接收实体的结构简单概括为:respEntity -> results(1个或多个) -> values -> text
创建完接收实体后,回到HTTP POST这里完成对buffer内的响应JSON字符串进行解析:

	respEntity rs = gson.fromJson(buffer.toString(), respEntity.class);
	System.out.println(rs);
    return rs.getResults().get(0).getValues().getText();

重写了接收实体的toString方法,得到的输出结果为:
resp [results=[results [values=values [text=好呀~有什么新鲜事儿了?]]]] (好可爱~)
然后,返回列表里第一个results对象的values中的text字符串,就得到图灵机器人的回复字符串了。

结束语

这样一整套从发送到解析接收的流程都结束了,我们在获得了字符串后,需要将它显示出来,包括发送和接收的字符串,下一篇我会继续说明关于如何在Android中完成聊天界面的搭建,可能要用到线程和其他UI的知识。
才疏学浅,本着分享记录的目的写文章,希望各位大佬能够多多指教。

参考的课程地址
我的源码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章