zoukankan      html  css  js  c++  java
  • 用flask Flask-RESTful,实现RESTful API

    简介:

    自从Roy Fielding博士在2000年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。

    如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。

    REST就是一种设计API的模式。最常用的数据格式是JSON。

    比方说下载最流行的AI技术,百度这个流氓还是开放了API接口,供我们有限度的免费调用。

    这个使用的就是API。

    学习RESTful API,对我们以后使用别人开放的API又很大的好处

    我们一起来看看RESTFul API有哪些特点:

    1. 基于“资源”,数据也好、服务也好,在RESTFul设计里一切都是资源。
    2. 无状态。一次调用一般就会返回结果,不存在类似于“打开连接-访问数据-关闭连接”这种依赖于上一次调用的情况。
    3. URL中通常不出现动词,只有名词
    4. URL语义清晰、明确
    5. 使用HTTP的GET、POST、DELETE、PUT来表示对于资源的增删改查
    6. 使用JSON不使用XML

      我举个例子:
      网站:/get_user?id=3
      RESTFul: GET /user/3 (GET是HTTP类型)


    作者:
    链接:https://www.imooc.com/article/17650
    来源:慕课网
    本文原创发布于慕课网 ,转载请注明出处,谢谢合作

    一:使用RESTful API的好处

    1.返回的不是HTML,而是机器能直接解析的数据

    随着ajax的流行,API返回数据,而不是HTML页面,数据交互量减少,用户体验会好。

    前后台分离,后台更多的进行数据处理,前台对数据进行渲染。

    2.直接使用api可以进行CRUD,增删改查

    一个标准的API,会有4个接口,get,put,post,delete,对应你的请求类型。就是WEB获取页面,上传表单,上传文件…………

    增删改查,结构清晰

    3.使用token令牌来进行用户权限认证,比cookie更安全

    虽然我还没明白这是什么意思,但是cookie确实是我爬网站时使用最多的伪造渠道。

    4.越来越多的开放平台,开始使用api接口

    我们学习了如果构建API,那么也就熟悉了解了如何使用,对以后使用开放API,又很大的帮助。

    也许某天,我们自己写的程序,也会开放一些API接口给大家用,那也应该符合RESTful API标准。

    二:快速入门

    1.官网

    其实这个不是官网,但是是中文文档。

    http://www.pythondoc.com/Flask-RESTful/quickstart.html

    2.安装

    安装 Flask 和 Flask-RESTful。

    本人测试环境如下:

    Flask==1.0.2
    Flask-HTTPAuth==3.2.4
    Flask-RESTful==0.3.6
    requests==2.19.1
    python 3.6.3
    windows 10 x64

    3.无脑测试

    快速入门当中的代码貌似和我现在的版本不太匹配了。

    下面这个是我改好的。

    from flask import Flask
    from flask_restful import Api,Resource
    
    app = Flask(__name__)
    api = Api(app)
    
    class HelloWorld(Resource):
        def get(self):
            return {'hello': 'world'}
    
    api.add_resource(HelloWorld, '/')
    
    if __name__ == '__main__':
        app.run(debug=True)

    这个代码跑起来看看访问:http://127.0.0.1:5000,返回值是

    {
        "hello": "world"
    }

    而且我们没有注册首页路由,用了api.add_resource.。

    返回的是一个JSON格式字符串。

    三:用requests库深入测试

    1.get就是我们日常浏览器访问的方式

    没错,就是爬虫用的requests库。

    from requests import get,put,post,delete
    #测试get
    t1=get('http://127.0.0.1:5000')
    print(t1)
    #返回码
    print(t1.text)
    #内容4

    返回值:

    <Response [200]>
    {
        "hello": "world"
    }

    返回码200,返回的text是json数据

    2.put

    from requests import get,put,post,delete
    #测试get
    t1=put('http://127.0.0.1:5000')
    print(t1)
    #返回码
    print(t1.text)
    #内容

    返回值:

    <Response [405]>
    {
        "message": "The method is not allowed for the requested URL."
    }

    还没写这个方法

    我们没写都会有正确的信息返回,还是用库吧,比自己写方便多了。

    主要是更加标准化。

    四:完整代码

    1.官方文档的完整代码示例

    from flask import Flask
    from flask_restful import reqparse, abort, Api, Resource
    
    app = Flask(__name__)
    api = Api(app)
    
    TODOS = {
        'todo1': {'task': 'build an API'},
        'todo2': {'task': '?????'},
        'todo3': {'task': 'profit!'},
    }
    
    
    def abort_if_todo_doesnt_exist(todo_id):
        if todo_id not in TODOS:
            abort(404, message="Todo {} doesn't exist".format(todo_id))
    
    parser = reqparse.RequestParser()
    parser.add_argument('task', type=str)
    
    
    # Todo
    #   show a single todo item and lets you delete them
    class Todo(Resource):
        def get(self, todo_id):
            abort_if_todo_doesnt_exist(todo_id)
            return TODOS[todo_id]
    
        def delete(self, todo_id):
            abort_if_todo_doesnt_exist(todo_id)
            del TODOS[todo_id]
            return '', 204
    
        def put(self, todo_id):
            args = parser.parse_args()
            task = {'task': args['task']}
            TODOS[todo_id] = task
            return task, 201
    
    
    # TodoList
    #   shows a list of all todos, and lets you POST to add new tasks
    class TodoList(Resource):
        def get(self):
            return TODOS
    
        def post(self):
            args = parser.parse_args()
            todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
            todo_id = 'todo%i' % todo_id
            TODOS[todo_id] = {'task': args['task']}
            return TODOS[todo_id], 201
    
    ##
    ## Actually setup the Api resource routing here
    ##
    api.add_resource(TodoList, '/todos')
    api.add_resource(Todo, '/todos/<todo_id>')
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    2.深入测试

    from requests import get,put,post,delete
    
    t1=get('http://127.0.0.1:5000/todos')
    #测试get 全部
    print(t1)
    #返回码
    print(t1.text)
    #内容
    
    
    t2=get('http://127.0.0.1:5000/todos/todo1')
    #测试获取一条
    print(t2)
    print(t2.text)
    
    t3=put('http://127.0.0.1:5000/todos/todo1',data={'task':'jack test'})
    #测试修改一条,todo1
    print(t3)
    print(t3.text)
    t4=get('http://127.0.0.1:5000/todos/todo1')
    #重新获取todo1
    print(t4)
    print(t4.text)
    
    t5=delete('http://127.0.0.1:5000/todos/todo1')
    #删除一个 todo1
    print(t5)
    print(t5.text)
    t6=get('http://127.0.0.1:5000/todos')
    #重新获取全部
    print(t6)
    print(t6.text)
    
    t7=post('http://127.0.0.1:5000/todos',data={'task':'new line'})
    print(t7)
    print(t7.text)
    #测试创建一个
    t8=get('http://127.0.0.1:5000/todos')
    print(t8)
    print(t8.text)

    3.总结

    测试代码中使用了嵌套字典来进行测试,换成数据库,应该会吧?

    五:

    1.

    2.

    3.

    六:

    1.

    2.

    3.

    七:

    1.

    2.

    3.

    八:

    1.

    2.

    3.

    九:

    1.

    2.

    3.

    十:

    1.

    2.

    3.

  • 相关阅读:
    boostrap各种设备大小,以及不同设备的隐藏和显示
    thinkphp5 layout布局的理解和使用,模板继承等等
    thinkphp5的前台是如何实现的,以及后台栏目的作用
    JS工作流进度条显示,以及相关的思路和原理
    Lnmp服务器集群配置研究和实践
    关于require.js写的最通俗易懂的文章
    使用js把html导出word,单位换算,配置样式和分页,页边距,字体及大小,行距,缩进,@page等等
    使用phpword插件,导出word,并解决循环数据的问题
    php使用array_filter函数,并使用闭包,动态的过滤数组
    leetcode——437. 路径总和 III
  • 原文地址:https://www.cnblogs.com/jackadam/p/9208439.html
Copyright © 2011-2022 走看看