写点什么

Go 小白实现一个简易的 go mock server

作者:真嗣
  • 2022 年 7 月 24 日
  • 本文字数:1372 字

    阅读完需:约 5 分钟

Go小白实现一个简易的go mock server

前言

学习 golang 也一段时间了,看了一些书,上周又看了一本入门级的《Go 语言趣学指南》,是时候检验成果了。

目的

通过读取本地 mock 数据,发起 http 请求,返回给前端,实现 mock 功能。

代码

整体代码只在 50 行代码左右,是一个极其简陋的 mock server,没有多余的功能(主要是不会

步骤 1

扫描本地以 json 结尾的文件,获取文件路径

// 获取当前json文件所在的路径已经文件名,然后进行拼接func ParsePath() (path string, err error) {   pwd, _ := os.Getwd()   fileList, err := ioutil.ReadDir(pwd)   if err != nil {      log.Fatal(err)   }   var curJsonFile string   for _, v := range fileList {      name := v.Name()      if isJson := strings.Contains(name, "json"); isJson {         curJsonFile = name      }   }   if curJsonFile == "" {      return curJsonFile, errors.New("dont have json file")   }   absPath := pwd + "/" + curJsonFile   return absPath, nil}
复制代码

步骤 2

// 根据传入的文件名读取具体的[]byte数据func ReadJSON(path string) ([]byte, error) {   jsonFile, err := os.Open(path)   if err != nil {      log.Fatal("open file err")   }   defer jsonFile.Close()   byteValue, err := ioutil.ReadAll(jsonFile)   if err != nil {      return nil, err   }   return byteValue, nil}
复制代码

步骤 3

// 根据传入的[]byte数据,将数据转换反序列化为map类型// 这里由于不知道json文件的具体数据,具体结构,所以用了map[string]interface{}的// 数据类型func DecodeJSONString(jsonBytes []byte) (map[string]interface{}, error) {   var m map[string]interface{}   err := json.Unmarshal(jsonBytes, &m)   if err != nil {      log.Fatal("json unmarshal fail", err)      return nil, err   }   return m, nil}
复制代码

步骤 4

var data map[string]interface{}
func returnResponse(w http.ResponseWriter, r *http.Request) { w.Header().Set("content-type", "application/json") path := r.URL.Path if d := data[path]; d != nil { stringData, err := json.Marshal(data[path]) if err != nil { log.Fatal(err) } w.Write(stringData) }}
func main() { path, err := src.ParsePath() if err != nil { log.Fatal(err) } bytes, err := src.ReadJSON(path) if err != nil { log.Fatal(err) } m, err := src.DecodeJSONString(bytes) data = m if err != nil { log.Fatal("decode fail: ", err) } for addr, _ := range data { http.HandleFunc(addr, returnResponse) } err = http.ListenAndServe(":3000", nil) if err != nil { log.Fatal("listenAndServer fail") }}
复制代码

最终效果

本地访问localhost:3000/v1/lottery 前端可以拿到返回的数据

mock 的本地 json 文件

{  "/v1/lottery": [{    "name": "shinji",    "age": 20  }, {    "name": "ayanami",    "age": 20  }]}
复制代码

最后

这个是一个非常建议的 mock server, 还不支持多文件格式,多个文件,多种请求方法,自定义规则 mock 数据等等。也只是对当前 Golang 学习后的一次小测验,很简单,希望大佬勿喷。

发布于: 4 小时前阅读数: 14
用户头像

真嗣

关注

fly me to the moon 2020.07.07 加入

nil

评论

发布
暂无评论
Go小白实现一个简易的go mock server_golang_真嗣_InfoQ写作社区