這里的id其實是自增主鍵,可以不必保留,但為了后面處理方便就一起保留了。
POST提交的JSON格式如下:
{ "id": 0, "name": "C", "score": 300 } |
現在我們可以著手實現index方法了:
def index(): cur = g.db.execute('select id, name, score from rank order by score desc;') result = cur.fetchmany(100) data = [] for row in result: data.append({'id': row[0], 'name': row[1], 'score': row[2]}) return jsonify({'data': data}) |
(其中jsonify和g在flask模塊內。后面不再對導入進行說明,默認都是從flask導入。)
在查詢時對數據做了排序,并且只返回了前100條記錄??梢杂胏url再測試一下。測試無誤再實現create方法:
def create(): status = {'status': 'OK'} if not request.json or not 'name' in request.json or not 'score' in request.json: status['status'] = 'bad request' try: g.db.execute('insert into rank (name, score) values (?, ?)', [request.json['name'], request.json['score']]) g.db.commit() except: status['status'] = 'database error' return jsonify(status) |
我們的POST請求都是JSON類型的,所以要從request.json獲得,而不是args或者form。此外,返回了一個status變量,便于查看出錯原因。
再用curl測試一下POST。這次,我們要向POST請求中加入數據:
curl -i -X POST -H "Content-Type: application/json" -d '{"id": 0, "name": "xyz", "score": "800"}' 127.0.0.1:5000/scores |
-H參數用于指定頭部信息,-d參數可以攜帶數據,這里就是一條符合我們提交格式的JSON數據。
現在服務器端就(暫時)實現完了。下面該寫C#代碼啦。
我們需要設計一個和服務器交互、并返回數據給UI層的類。
首先,這個類應該是單例的,要繼承MonoBehaviour(因為和服務器交互要利用Coroutine);而且最好獨立于場景之外。關于Unity中實現單例類的集中方式,請看我的另一篇文章。單例的代碼如下:
private static SaveLoad _instance = null; public static SaveLoad Instance { get { if (_instance == null) { GameObject go = new GameObject("SaveLoadGameObject"); DontDestroyOnLoad(go); _instance = go.AddComponent<SaveLoad>(); } return _instance; } } |
還需要定義一些常量:
const int recordsPerPage = 5; const string URL = "127.0.0.1:5000/scores"; |
定義一個數據結構:
public struct Data { public int id; public string name; public int score; } |
在動手之前,還要了解兩個東西:WWW類和LitJson庫。WWW類是Unity自帶的處理HTTP請求的類;LitJson是一個C#處理JSON的開源庫。要使用LitJson,先從官網下載dll文件,然后導入Asset。
SaveLoad類的功能就像名字一樣,包括保存Save和載入Load。
原文轉自:http://www.uml.org.cn/Test/201503235.asp