Tornado的同步API写法举例实现GET/POST/DELETE请求+Tornado获取post请求中的json数据(转载)

下面的实验主要来自[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请求测试:

浏览器打开http://127.0.0.1:3000/

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请求测试:

浏览器打开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/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)

[2]How to build a REST API in Python with Tornado (part 2)

[3]tornado获取客户端以json字符串提交的数据

发布了824 篇原创文章 · 获赞 394 · 访问量 175万+

猜你喜欢

转载自blog.csdn.net/appleyuchi/article/details/105416549