无论是产品的快速迭代,还是使用敏捷开发,需求总会不断地增加,变更。
一个普遍的开发场景是(串行,省略部分会议)
接口文档定义>>服务器开发>>客户端开发>>接口上线>>联调>>测试上线。
如果在快速迭代的环境下,两周左右一个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服务器了,还不快去把测试用例补一补!