Mock-server模拟项目接口配置

Mock-Server

一 下载地址

moco框架下载地
https://github.com/dreamhead/moco github项目地址
https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.11.0/ jar包下载地址
https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md#query-parameter 文档

image.png

测试一下

如下图创建一个mock_server的文件夹

把下载的jar包放在mock_server文件夹下面

创建一个test.json文件,内容如下:

[{
    "description": "模拟一个没有参数的get请求。",
    "request": {
        "uri": "/api",
        "method": "get"
    },
    "response": {
        "text": "hello get request !"
    }
}
]

切换到mock_server目录执行命令

java -jar ./moco-runner-0.11.0-standalone.jar http -p 7666 -c test.json

成功的截图:能看到server us started at 端口号

image.png

**get请求浏览器输入 ** http://localhost:7666/api

image.png

如果响应正文是有乱码怎么办,加个headers

image.png
[{
   "description": "模拟一个没有参数的get请求。",
   "request": {
      "uri": "/api",
      "method": "get"
   },
   "response": {
      "text": "hello get request !中国",
        "headers": {
              "Content-Type":"text/html;charset=gbk"
            }
   }
}
]
image.png

二 基本操作

get请求

get请求:没有请求参数

[{
    "description": "模拟一个没有参数的get请求。",
    "request": {
        "uri": "/api",
        "method": "get"
    },
    "response": {
        "text": "hello get request !中国",
        "headers": {
              "Content-Type":"text/html;charset=gbk"
            }
    }
}
]
import requests

base_url = "http://127.0.0.1:7666"
res = requests.request("get", base_url + "/api")
print(res.text)
image.png

get请求:有参数

[
  {
    "description": "模拟一个没有参数的get请求。",
    "request": {
      "uri": "/api/moco/get/demo",
      "method": "get"
    },
    "response": {
      "text": "hello get request !"
    }
  },
  {
    "description": "模拟一个带参数的get请求。",
    "request": {
      "uri": "/api/moco/get/param/demo",
      "method": "get",
      "queries": {
        "name": "xiaoming",
        "age": "18"
      }
    },
    "response": {
      "text": "hello xiaoming !"
    }
  }
]
import requests

base_url = "http://127.0.0.1:7666"
data = {
    "name": "xiaoming",
    "age": "18"
}
res = requests.request("get", base_url + "/api/moco/get/param/demo", params=data)
print(res.text)
print(res.status_code)
image.png

post请求,cookies,表单传参

[
  {
    "description": "模拟一个带cookie的post请求。",
    "request": {
      "uri": "/api/moco/post/cookies/demo",
      "method": "post",
      "cookies": {
        "login": "true"
      },
      "forms": {     # post请求的参数也可以用json格式的数据进行传输
        "name": "xiaoming",
        "age": "18"
      }
    },
    "response": {
      "status": 201,
      "json": {
        "text": "hello post cookies !"
      }
    }
  }
]
import requests

base_url = "http://127.0.0.1:7666"
data = {
    "name": "xiaoming",
    "age": "18"
}
cookies = {
    "login": "true"
    }
res = requests.request("post", base_url + "/api/moco/post/cookies/demo", data=data,cookies=cookies)
print(res.text)
print(res.json())
print(res.status_code)
image.png

post请求+cookies+json传参

[
  {
    "description": "模拟一个带cookie的post请求。",
    "request": {
      "uri": "/api/moco/post/cookies/demo",
      "method": "post",
      "cookies": {
        "login": "true"
      },
      "json": {
        "name": "xiaoming",
        "age": "18"
      }
    },
    "response": {
      "status": 201,
      "json": {
        "text": "hello post cookies !"
      }
    }
  }
]
import requests

base_url = "http://127.0.0.1:7666"
data = {
    "name": "xiaoming",
    "age": "18"
}
cookies = {
    "login": "true"
    }
res = requests.request("post", base_url + "/api/moco/post/cookies/demo", json=data,cookies=cookies)
print(res.text)
print(res.json())
print(res.status_code)
image.png

post请求有headers

[
  {
    "description": "模拟一个带cookie的post请求。",
    "request": {
      "uri": "/api/moco/post/cookies/demo",
      "method": "post",
      "cookies": {
        "login": "true"
      },
      "header": {
        "content-type": "application/json"
      },
      "json": {
        "name": "xiaoming",
        "age": "18"
      }
    },
    "response": {
      "status": 201,
      "json": {
        "text": "hello post cookies !"
      }
    }
  }
]
import requests

base_url = "http://127.0.0.1:7666"
data = {
    "name": "xiaoming",
    "age": "18"
}
cookies = {
    "login": "true"
    }
headers = {
    "content-type": "application/json"
}
res = requests.request("post", base_url + "/api/moco/post/cookies/demo", json=data,cookies=cookies,headers=headers)
print(res.text)
print(res.json())
print(res.status_code)
image.png

模拟重定向

[
  {
    "description": "重定向",
    "request": {
      "uri": "/api/moco/redirect/demo",
      "method": "get"
    },
    "redirectTo": "/api/moco/redirect/new/demo"
  },
  {
    "description": "重定向到自己的接口",
    "request": {
      "uri": "/api/moco/redirect/new/demo",
      "method": "get"
    },
    "response": {
      "status": 301,
      "text": "hello redirectTo !"
    }
  }
]
import requests

base_url = "http://127.0.0.1:7666"

res = requests.request("get", base_url + "/api/moco/redirect/demo")
print(res.text)
print(res.status_code)
image.png

在浏览器中输入 http://127.0.0.1:7666/api/moco/redirect/demo 直接跳转到如下图

image.png

三 项目全局配置Mock

上面的例子所有的接口,和数据都放在一个json文件里面,如果有100个接口,很难维护这个json文件。下面我们用一个实际的接口文档来Mock,全局配置。接口文档如下

1.1 注册

接口地址:http://127.0.0.1:8082/erp/regist
请求方式:POST
POST 请求格式:application/json
响应格式:application/json

image.png

返回示例:

{
"name": "zhang",
"pwd": "111",
"age": null,
"email": null,
"phone": null
}

1.2 登录

接口地址:http://127.0.0.1:8080/erp/loginIn
请求方法:POST
POST 请求格式:application/json
响应格式:application/json

image.png

返回示例:

{
  "code": "200",
  "message": "登录成功",
  "token": "3768e8cf0c1bd64028eee6c2d44e100a340c914c68e71cb76c93b4931259c3aa"
}

1.3 查询用户信息

业务描述:查询接口,是根据请求头中传过来的 Token 值,系统自动判断,然后返回登录用户的信息
接口地址:http://127.0.0.1:8080/erp/user
请求方法:get
请求头:Token
响应格式:application/json
参数:无
返回示例:
{
"name": "zhang",
"pwd": "111",
"age": null,
"email": null,
"phone": null
}

准备

在项目根目录,建立一个mock-server文件夹。

根据接口文档,一个接口一个文件夹,文件夹里面,再创建1个发请求格式的json文件,一个响应返回数据的json文件。

创建一个register文件夹,里面创建一个register.json, register_response.json.

创建一个login文件夹,里面创建一个login.json, login_response.json.

创建一个user文件夹,里面创建一个user.json, user_response.json.

login登录成功的token,user查询用户接口需要传到headers里面

register.json数据,根据接口文档编写

[
  {
    "description": "模拟一个注册接口",
    "request": {
      "uri": "/erp/regist",
      "method": "post",
      "headers": {
        "content-type": "application/json"
      },
      "json": {
        "name": "adeng",
        "pwd": "a12345678"
      }
    },
    "response": {
      "status": 201,
      "headers":{
        "content-type": "application/json"
      },
      "file" : "register/register_response.json"
    }
  }
]

register_response.json 注册返回的响应正文数据

{
"name": "adeng",
"pwd": "a12345678",
"age": null,
"email": null,
"phone": null
}

**login.son **

[
  {
    "description": "模拟一个登录接口",
    "request": {
      "uri": "/erp/loginIn",
      "method": "post",
      "headers": {
        "content-type": "application/json"
      },
      "json": {
        "name": "adeng",
        "pwd": "a12345678"
      }
    },
    "response": {
      "status": 201,
      "headers":{
        "content-type": "application/json"
      },
      "file" : "./login/login_response.json"
    }
  }
]

login_response.json

{
  "code": "200",
  "message": "登录成功",
  "token": "3768e8cf0c1bd64028eee6c2d44e100a340c914c68e71cb76c93b4931259c3aa"
}

user.josn

[
  {
    "description": "模拟一个查询接口",
    "request": {
      "uri": "/erp/user",
      "method": "get",
      "headers": {
        "token": "3768e8cf0c1bd64028eee6c2d44e100a340c914c68e71cb76c93b4931259c3aa"
      }
    },
    "response": {
      "status": 201,
      "headers":{
        "content-type": "application/json"
      },
      "file" : "./user/user_response.json"
    }
  }
]

user_response.json

{
"name": "adeng",
"pwd": "a12345678",
"age": null,
"email": null,
"phone": null
}

注意请求的json,response,file的值

file的值是mock_server目录下每一个接口的 response.json相对于mock_server的路径

image.png

演练步骤

切换到mock_server目录

执行java -jar ./moco-runner-0.11.0-standalone.jar start -p 4111 -g settings.json

编写python模拟发送请求

注册接口

import requests

base_url = "http://127.0.0.1:4111"
headers = {
    "content-type": "application/json"
}
# 参数
data = {
        "name": "adeng",
        "pwd": "a12345678"
}

res = requests.request("post", base_url + "/erp/regist",headers=headers,json=data)
print(res.text)
print(res.status_code)
print(res.json())
image.png

登录接口

import requests

base_url = "http://127.0.0.1:4111"

headers = {
    "token": "3768e8cf0c1bd64028eee6c2d44e100a340c914c68e71cb76c93b4931259c3aa"
}


res = requests.request("get", base_url + "/erp/user",headers=headers)
print(res.text)
print(res.status_code)
print(res.json())

image.png

查询用户接口

import requests

base_url = "http://127.0.0.1:4111"

headers = {
    "token": "3768e8cf0c1bd64028eee6c2d44e100a340c914c68e71cb76c93b4931259c3aa"
}


res = requests.request("get", base_url + "/erp/user",headers=headers)
print(res.text)
print(res.status_code)
print(res.json())
image.png

CMD命令启动和停止

-s port 是关闭的端口号

java -jar moco-runner-0.11.0-standalone.jar http -p 7666 -c test.json -s 9527
java -jar moco-runner-0.11.0-standalone.jar shutdown -s 9527

发送 https

制作cert证书

通过jdk命令生成证书

keytool -genkey -alias adeng -keypass 123456 -keyalg RSA -keysize 1024 -validity 3650 -keystore i:/adeng.keystore -storepass 123456

keytool -genkey -alias adeng -keypass 123456 -keyalg RSA -keysize 1024 -validity 3650 -keystore i:/adeng.keystore -storepass 123456

说明

  • -alias adeng (别名)
  • -keypass 123456(别名密码)
  • -keyalg RSA(生证书的算法名称,RSA是一种非对称加密算法)
  • -keysize 1024(密钥长度,证书大小)
  • -validity 365(证书有效期,天单位)
  • -keystore e:/zhengshu.keystore (指定生成证书的位置和证书名称)
  • -storepass 123456(获取keystore信息的密码)
image.png

然后将生成的证书adeng.keystore放在mock-server目录下

image.png

test.json文件内容

[{
   "description": "模拟一个没有参数的get请求。",
   "request": {
      "uri": "/api",
      "method": "get"
   },
   "response": {
      "text": "hello get request !"
   }
}
]

启动https mock-server

java -jar moco-runner-1.2.0-standalone.jar https -p 4118 -c test.json --https adeng.keystore --cert 123456 --keystore 123456 -s 6543

java -jar moco-runner-1.2.0-standalone.jar https -p 4118 -c test.json --https adeng.keystore --cert 123456 --keystore 123456 -s 6543

requests模拟发送请求

verify = False 记得设置这个参数默认为None

import requests
import os
# https 需要取消认证 verify=false
res = requests.request("get","https://127.0.0.1:4118/api",verify=False)
print(res.text)
# 关闭mock服务器
os.system("java -jar moco-runner-1.2.0-standalone.jar shutdown -s 6543")
image.png

参考文献

https://blog.csdn.net/shensky711/article/details/52770686

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容