Andriod收藏Android知识生活不易 我用python

Android+Python Flask+Nginx搭建Mock

2016-09-15  本文已影响1796人  豆沙包67

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

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

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

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

可以实现的方法有:

第二种方法比第一种难,而且比较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服务器了,还不快去把测试用例补一补!

上一篇下一篇

猜你喜欢

热点阅读