经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
go mock server的简易实现示例
来源:jb51  时间:2022/7/25 19:15:54  对本文有异议

前言

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

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

代码

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

步骤1

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

  1. // 获取当前json文件所在的路径已经文件名,然后进行拼接
  2. func ParsePath() (path string, err error) {
  3. pwd, _ := os.Getwd()
  4. fileList, err := ioutil.ReadDir(pwd)
  5. if err != nil {
  6. log.Fatal(err)
  7. }
  8. var curJsonFile string
  9. for _, v := range fileList {
  10. name := v.Name()
  11. if isJson := strings.Contains(name, "json"); isJson {
  12. curJsonFile = name
  13. }
  14. }
  15. if curJsonFile == "" {
  16. return curJsonFile, errors.New("dont have json file")
  17. }
  18. absPath := pwd + "/" + curJsonFile
  19. return absPath, nil
  20. }

步骤2

  1. // 根据传入的文件名读取具体的[]byte数据
  2. func ReadJSON(path string) ([]byte, error) {
  3. jsonFile, err := os.Open(path)
  4. if err != nil {
  5. log.Fatal("open file err")
  6. }
  7. defer jsonFile.Close()
  8. byteValue, err := ioutil.ReadAll(jsonFile)
  9. if err != nil {
  10. return nil, err
  11. }
  12. return byteValue, nil
  13. }

步骤3

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

步骤4

  1. var data map[string]interface{}
  2. func returnResponse(w http.ResponseWriter, r *http.Request) {
  3. w.Header().Set("content-type", "application/json")
  4. path := r.URL.Path
  5. if d := data[path]; d != nil {
  6. stringData, err := json.Marshal(data[path])
  7. if err != nil {
  8. log.Fatal(err)
  9. }
  10. w.Write(stringData)
  11. }
  12. }
  13. func main() {
  14. path, err := src.ParsePath()
  15. if err != nil {
  16. log.Fatal(err)
  17. }
  18. bytes, err := src.ReadJSON(path)
  19. if err != nil {
  20. log.Fatal(err)
  21. }
  22. m, err := src.DecodeJSONString(bytes)
  23. data = m
  24. if err != nil {
  25. log.Fatal("decode fail: ", err)
  26. }
  27. for addr, _ := range data {
  28. http.HandleFunc(addr, returnResponse)
  29. }
  30. err = http.ListenAndServe(":3000", nil)
  31. if err != nil {
  32. log.Fatal("listenAndServer fail")
  33. }
  34. }

最终效果

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

mock的本地json文件

  1. {
  2. "/v1/lottery": [{
  3. "name": "shinji",
  4. "age": 20
  5. }, {
  6. "name": "ayanami",
  7. "age": 20
  8. }]
  9. }

最后

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号