基于Go实现的swapi像素复刻版的后端实现

项目要求

这次的任务要求是复刻一个https://swapi.co/api/people/2/ 出来。主要是通过url分割来访问对应的api接口。我完成的是后端的部分

项目分割

后端的工作主要有两个模块,一个是通过写一个数据库的接口来从db文件中,通过boltDB(Go语言官方钦点的一个轻量级键值对数据库);另一个是通过之前用过的gorella包中的mux来分割url请求(类似一个路由功能),并返回一个request

数据库文件的操作

这一部分的任务分为三个小任务

从swapi网站爬取json数据

值得一提的是,swapi.co有一些反爬虫的设定,包括ip的每日访问次数不超过一万、检查报文头部等方法。爬下来的东西用文本文档来存

把json数据通过boltDB写入数据库

读入爬下来的文本文档,把他们存入对应api的db文件内。这一部分需要使用boltDB的方法Open和Update 需要传入一个函数作为参数,并在这个函数内实现数据库的添加功能。主要思路是每一个api获取对应的db文件内和id对应的那一个json串,数据库的《Key,Value》=《id, JSON》这样写非常便利

func main() {
   db,err := bolt.Open("starships.db", 0600, nil)
   if err != nil {
      log.Fatal(err)
   }
   if db == nil {
      log.Fatal(db)
   }

   db.Update(func(tx *bolt.Tx) error {
      // 获取BlockBucket表单
      tx.CreateBucket([]byte("starships"))
      return nil;
   })

   db.Update(func(tx *bolt.Tx) error {
      // 获取Bucket筒

      b:=tx.Bucket([]byte("starships"))
      for i := 1; i < 88; i++ {
         file, err := os.Open("starships/" + strconv.Itoa(i))

         if err != nil {
            continue//如果不存在,则不读
            //log.Fatal(err)
         }
         temp, err1 := ioutil.ReadAll(file)
         if err1 != nil {
            log.Fatal(err)
         }
         fmt.Printf("read" + strconv.Itoa(i))
         // 往表里面存储数据
         if b != nil {
            err := b.Put([]byte(strconv.Itoa(i)), []byte(temp))//把数据存入数据库
            if err != nil {
               log.Panic("数据存储失败......")
            }
         }
      }
      return nil
   })
 }

一个有意思的东西:通过boltd图形化的查看boltDB数据库内容

在这里插入图片描述
具体使用方法:

go get github.com\boltdb\boltd
cd github.com\boltdb\boltd\cmd
go build main.go

然后把编译文件粘贴到数据库db文件同一目录下,main :9000 test.db
此时显示
在这里插入图片描述

在这里插入图片描述

为数据库提供一个接口

这一部分在Storage.go 中实现,如果追求性能的话应该让数据库一直维持打开状态(值得一提的是,打开后会出现读锁)此处偷了一下懒。输入id返回一个json串

func  GetPeople(PeopleID int)  (string)  {
   db,err:=bolt.Open("people.db",0600,nil)
   // fmt.Print("34454523")
   if err !=nil{
      log.Fatal(err)
   }
   // fmt.Print("344454554523")
   if db ==nil{
      log.Fatal(db)
   }
   //fmt.Print("34343")
    var result string
   db.View(func(tx *bolt.Tx) error {
      // Assume bucket exists and has keys
      b := tx.Bucket([]byte("people"))
      if(b==nil){
         log.Fatal(b)
      }
      result=string(b.Get([]byte(strconv.Itoa(PeopleID))))
      //fmt.Printf("1234+%s\n",result)

      return nil
   })
    db.Close()
   // fmt.Printf("%s\n",result)
    return result;
}

url分割访问数据库

这一部分比较简单,就是用之前实现过的路由功能解析请求,完成对应的函数
在这里插入图片描述

在这里插入图片描述

如此一来,运行后输入对应的api url,就可以得到返回的json串,接下来就交给前端了

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kotomineshiki/article/details/85041559