圖靈機器人聊天應用之HTTP POST和JSON
- 概述
- API接入
-
- 接入說明
- HTTP POST請求
- JSON字元串
-
- Gson
- 發送請求
- 解析接收
- 結束語
概述
平台概述:圖靈機器人開放平台是北京光年無限科技旗下的個性化人工智能機器人開放平台。通過圖靈機器人開放平台,軟硬體産品開發者可快速為自己的産品接入一款具備個性化身份屬性特征、滿足不同場景多輪對話及上下文對話的人工智能機器人,實作産品的對話式互動。
注意:圖靈機器人新注冊的使用者在未實名認證的前提下,一個機器人一天隻能發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的知識。
才疏學淺,本着分享記錄的目的寫文章,希望各位大佬能夠多多指教。
參考的課程位址
我的源碼