基於Go實現的swapi畫素復刻版的後端實現
阿新 • • 發佈:2018-12-17
專案要求
這次的任務要求是復刻一個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串,接下來就交給前端了