下面的实验主要来自[1][2],但是对实验2的代码进行了修改,修改过程参考了[3]
#---------------------------------------------------实验1-------------------------------------------------------------------
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
class HelloHandler(RequestHandler):
def get(self):
self.write({'message': 'hello world'})
def make_app():
urls = [("/", HelloHandler)]
return Application(urls, debug=True)
if __name__ == '__main__':
app = make_app()
app.listen(3000)
IOLoop.instance().start()
python test1.py
**************************************************************
GET请求测试:
GET请求结果:
#---------------------------------------------------实验2-----------------获取post请求中的json数据--------------------------------------------------
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
import json
items = ['csdn']
class TodoItems(RequestHandler):
def get(self):
self.write({'items': items})
class TodoItem(RequestHandler):
def post(self):
# items.append(self.request.body)
print("-----------------进入post----------------")
print(self.request)
print("--------------self.write之前------------------")
jsonbyte = self.request.body
jsonstr = jsonbyte.decode('utf8') #解码,二进制转为字符串
print('Json字符串:', jsonstr)
jsonobj = json.loads(jsonstr) #将字符串转为json对象
# self.write({'message': self.request.body})
self.write(jsonobj)
def make_app():
urls = [
("/", TodoItems),
("/api/item/", TodoItem)
]
return Application(urls, debug=True)
if __name__ == '__main__':
app = make_app()
app.listen(3000)
IOLoop.instance().start()
python test2.py
**************************************************************
GET请求测试:
浏览器打开:
http://127.0.0.1:3000/
GET请求结果:
**************************************************************
POST请求测试:
curl -H "Content-Type: application/json" -X POST -d '{"user_id": "123", "coin":100, "success":1, "msg":"OK!" }' "http://127.0.0.1:3000/api/item/"
POST请求结果:
{"user_id": "123", "coin": 100, "success": 1, "msg": "OK!"}
#----------------------------------------实验3-----------------------------curl发送delete请求---------------------------------------------------------
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
import json
items = []
class TodoItems(RequestHandler):
def get(self):
self.write({'items': items})
class TodoItem(RequestHandler):
def post(self, _):
items.append(json.loads(self.request.body))
self.write({'message': 'new item added'})
def delete(self, id):
global items
new_items = [item for item in items if item['id'] is not int(id)]
items = new_items
self.write({'message': 'Item with id %s was deleted' % id})
def make_app():
urls = [
("/", TodoItems),
(r"/api/item/([^/]+)?", TodoItem)
]
return Application(urls, debug=True)
if __name__ == '__main__':
app = make_app()
app.listen(3000)
IOLoop.instance().start()
python test3.py
***********************************************
GET请求测试:
GET请求测试结果:
***********************************************
POST请求测试:
curl -H "Content-Type: application/json" -X POST -d '{"user_id": "123", "coin":100, "success":1, "msg":"OK!" }' "http://127.0.0.1:3000/api/item/342"
POST请求测试结果:
{"message": "new item added"}
***********************************************
DELETE请求测试:
curl -v -X DELETE 127.0.0.1:3000/api/item/342
DELETE请求测试结果:
{"message": "Item with id 342 was deleted"}
#---------------------------------------------------------结束--------------------------------------------------------------------------
Reference:
[1]How to build a REST API in Python with Tornado (part 1)