rest api的编写

来源:互联网 发布:深圳八爪网络 编辑:程序博客网 时间:2024/05/21 15:07

0.What is rest :

REST(英文:Representational State Transfer,又称具象状态传输)是Roy Thomas Fielding博士于2000年在他的博士论文[1] 中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。

目前在三种主流的Web服务实现方案中,因为REST模式与复杂的SOAP和XML-RPC相比更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务运行图书查询;雅虎提供的Web服务也是REST风格的。

是不是还是一头露水?没关系,我也不知道为啥叫这个名字,只知道用它实现的API在跨语言跨平台方面做的很好。REST 其实就是一类设计风格,可以通过REST来方便定义web API.它典型的特征就是:通过HTTP协议进行访问不同的资源数据,发出和得到的结果都是json格式的数据。通过使用json格式来规约数据,在不同的开发语言、系统中交互。

典型的,SDN控制器一般都会提供REST API来为用户提供查询和下发流表的便捷的接口。

现在,我们在做一个机器学习的比赛,已经把数据上传远程服务器的mongodb中 ,但是出于某些原因我又不想把mongodb的控制权完全给别人。那现在我想快速设计一个web API,方便队友来访问mongodb里面的数据,那么应该怎么搞呢?

很好搞,只要需要使用Python的Flask框架即可。

1.安装 Flask

python2.x

pip install Flask 

python 3.x

pip3 install Flask

2.编码

__author__ = 'jmh081701'import  flaskfrom flask import Flask,jsonifyfrom flask import  requestapp=Flask(__name__)@app.route("/api/shop",methods=["POST"])def getShop():        if not request.json:            return "Needed Json."        cond=request.json['cond']        cnt=None        if("limit" in request.json):            cnt=int(request.json["limit"])        data=db.get_shipinfo(cond,cnt)        return jsonify(data)app.run(host="127.0.0.1",port=9000)

其中@app.route(“/api/shop”,methods=[“POST”]) ···指定了当用户去访问http://ip:port/api/shop 时,同时又是使用POST方法时就会调用下面的getShop()函数。
我们需要用户POST一个字典:
个数类似于下面这样:
{
“cond”:{条件},
“limit”:数据条数
}
表示队友想查询满足cond条件的前limit条数据。
当用户的确向我们指定的URL POST了一个字典后,request.json此时就有值了,这个变量保存用户POST过来的数据,通过解析这个json,我们就可以采取相应的措施啦。
比如使用cond去数据查数据,然后将查询到的data通过jsonify返回。

注意函数最后由 jsonify返回的一个字典,jsonify的参数也需要是一个字典,所有我们在编程的时候要保证这一点。不过在mongodb里面,find出来的结果本来就是一个dict了,哈哈哈,美滋滋。不过要注意把mongodb的find()函数的返回每个dict里面的”_id”key去掉,这是因为“_id”是一个ObjectID对象,jsonify处理不了。

app.run(host=xxx,port=xxx)指定了这个rest api运行的ip和端口号。

3.运行并获取数据

做完第二步后,让脚本运行起来,就可以在其他终端去访问那个api啦。
比如 使用 curl 或者 python的urllib 或者requests 进行普通的post 就可以得到数据了,还是超级方便的。