1. 程式人生 > >基於Go實現的swapi畫素復刻版的後端實現

基於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串,接下來就交給前端了

在這裡插入圖片描述

在這裡插入圖片描述