目的
用于在开发阶段,服务端接口没有正式完成之前,模拟接口请求,便于客户端测试。
实现
建立一个文件夹(Config),放置所有的接口文件
编写接口文件
将接口按如下json格式存储到成文件,一个接口对应一个文件
如登录接口:./Config/login.json
path: 接口路径
desc: 接口描述
response:响应数据
{
"path": "/login",
"desc": "login api",
"response":"{\"code\":0,\"message\":\"success\"}"
}
代码
定义接口
type API struct{
Path string `json:"path"`
Desc string `json:"desc"`
Response string `json:"response"`
}
读取所有的接口配置文件
var apis []API
func loadConfig(path string) {
/* 读取目录下所有的json文件,解析成API数组,存放到apis中 */
files, err := ioutil.ReadDir(path)
if err != nil {
log.Fatal(err)
}
for _, file := range files {
if strings.HasSuffix(file.Name(), "json") {
f, err := os.OpenFile(path + file.Name(), os.O_RDONLY, 0755)
defer f.Close()
if err != nil {
log.Fatal("read config error : ", err.Error())
}
data := make([]byte, 1000)
n, err := f.Read(data)
if err != nil {
log.Fatal(err)
}
fmt.Printf(string(data[:n]))
var api API
err = json.Unmarshal(data[:n], &api)
if err != nil {
log.Fatal(err)
}
apis = append(apis, api)
}
}
}
开启HTTP服务
func findAPIForPath(path string) API {
for _, api := range apis {
//todo: 换成正则表达式匹配
if strings.Compare(api.Path, path) == 0 {
return api
}
}
return API{Response:"Not found"}
}
func handleHttpRequest(w http.ResponseWriter, req * http.Request) {
fmt.Println("receive request : " + req.URL.Path);
api := findAPIForPath(req.URL.Path)
//todo: 参数校验,HTTP Header校验, response Header设置
w.Write([]byte(api.Response))
}
func main() {
fmt.Printf("Start mock...\n")
apis = make([]API, 0)
loadConfig("./Config/")
http.HandleFunc("/",handleHttpRequest)
http.ListenAndServe(":8001", nil)
}
运行
go run ./main.go
网友评论