这里的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条记录。可以用curl再测试一下。测试无误再实现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