圖靈機器人聊天應用之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的知識。
才疏學淺,本着分享記錄的目的寫文章,希望各位大佬能夠多多指教。

參考的課程地址
我的源碼

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