项目要求
这次的任务要求是复刻一个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串,接下来就交给前端了