Android+Python Flask+Nginx搭建Mock

作者: 豆沙包67 | 来源:发表于2016-09-15 17:14 被阅读1796次

    无论是产品的快速迭代,还是使用敏捷开发,需求总会不断地增加,变更。
    一个普遍的开发场景是(串行,省略部分会议)

    接口文档定义>>服务器开发>>客户端开发>>接口上线>>联调>>测试上线。
    

    如果在快速迭代的环境下,两周左右一个Android版本就必须登陆市场。如果按照上面的流程来走,会给Android/iOS/WP程序员带来巨大的压力,第一周等服务器写接口,第二周拼命加班赶进度,还有被测试催时间。

    假如可以先通过接口文档的定义,自己模拟出服务器返回结果,通过代理方式进行开发测试,等服务器上线之后,客户端一行代码都无需改动就可以提交测试,so cool~

    可以实现的方法有:

    • 通过抓包工具,例如Fiddler/charles
    • 通过自建服务器和反向代理

    第二种方法比第一种难,而且比较hacker,下面讲解第二种方法。

    Python环境安装

    我用的Python 2.7,安装步骤请谷歌。

    Flask和REST框架安装

    Flask安装
    Flask REST安装

    Nginx安装

    Nginx windows zip

    Python请求

    上面的环境问题可以根据windows/mac/linux系统自行选择配置,这里不再赘述。
    现在进入代码编写部分,easy!

    GET请求

    GET请求包括了大部分的请求。
    下面是简单的Python代码,引入包

    from flask import abort, jsonify, Flask, request
    

    初始化 & 造点数据吧

    app = Flask(__name__)
    
    tasks = [
        {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
            'done': False
        },
        {
            'id': 2,
            'title': u'Learn Python',
            'description': u'Need to find a good Python tutorial on the web',
            'done': False
        }
    ]
    

    定义请求

    @app.route("/todo", methods=['GET'])
    def get_all_task():
        return jsonify({"task": tasks})
    

    启动服务器

    if __name__ == "__main__":
        app.run()
    

    检查,打开命令行输入

    curl http://localhost:5000/todo
    

    或者在浏览器中输入

    http://localhost:5000/todo
    

    可以得到前面造的数据。

    Post请求

    假设往数据库里面插数据,先判断是否Json字段,主键有没有重复。参数合法则从中取值,构建Task对象并插入队列中。

        @app.route("/todo/tasks", methods=["POST"])
        def create_task():
            if not request.json or not "title" in request.json:
                return jsonify({"error" : "wrong parameters"})
            task = {
                "id" : tasks[-1]["id"] + 1,
                "title" : request.json["title"],
                "des" : request.json.get("des", "")
            }
            tasks.append(task)
            return jsonify({"task" : task}), 201
    

    Nginx

    反向代理

    可以理解一下知乎中关于反向代理的回答

    它代理了服务器,可以监听转发用户的请求到指定的服务器,然后再把应答转发到相应的客户端。

    把Nginx下载完成后,在安装目录下打开conf/nginx.conf,配置如下:

    upstream xxstream {
        server 8.8.8.8:80;(正常服务器地址)
    }
    
     server {
            listen       x.x.x.x:80; (填写本地的ip地址)
            server_name  www.google.com;(需要监听请求的域名)
        
            
            location / {(正常请求走正常流程)
                resolver 127.0.0.1;
                proxy_set_header Host $http_host;
                proxy_connect_timeout 5;
                proxy_pass http://xxstream /;
                error_log  logs/access.log  debug;
            }
    
            
            location = /xxx/yyy(需要拦截的地址) {
                proxy_pass http://localhost:5000;(自建服务器地址,这里是Flask默认地址)
            }
        }
    

    上面的配置代表监听从x.x.x.x:80发出的请求中带有www.baidu.com域名的请求,其中www.google.com/xxx/yyy的请求发往自己的服务器,其他则发往正常的服务器(upstream中定义)。

    请求分发

    还有需要在本地hosts添加

    x.x.x.x www.google.com #(本地ip地址 请求域名)
    

    重启Nginx服务器。

    在Python服务器开启后可以看见过滤的请求。

    在手机链接wifi设置静态代理,x.x.x.x:80

    总结

    如果你跟着完成到这里,恭喜你,代码没写多少,配环境倒是花了不少时间,毕竟是一劳永逸的东西。

    终于可以实现自己的Mock服务器了,还不快去把测试用例补一补!

    相关文章

      网友评论

        本文标题:Android+Python Flask+Nginx搭建Mock

        本文链接:https://www.haomeiwen.com/subject/hnjuettx.html