目录
  • 前言
  • 代码
    • 步骤1
    • 步骤2
    • 步骤3
    • 步骤4
    • 最终效果
  • 最后

    前言

    学习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 前端可以拿到返回的数据

    go mock server的简易实现示例

    mock的本地json文件

    {
      "/v1/lottery": [{
        "name": "shinji",
        "age": 20
      }, {
        "name": "ayanami",
        "age": 20
      }]
    }
    

    最后

    这个是一个非常简易的mock server, 还不支持多文件格式,多个文件,多种请求方法,自定义规则mock数据等等。也只是对当前Golang学习后的一次小测验,很简单,更多关于go mock server实现的资料请关注其它相关文章!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。