在上篇文章go語言打造我的博客系統(一)中,咱們瞭解了go語言的優勢和go語言的數據庫操做,本次咱們會完成博客系統的後端開發。html
http.HandleFunc("/ping", Pong)
func Pong(w http.ResponseWriter, r *http.Request) { w.Write([]byte("pong")) }
博客上傳正常須要傳遞不少文本,這個字符串存儲不太理想,習慣上會把博客內容造成一個文件,將文件信息存儲到後端服務器當中前端
http接口設計:golang
名稱 | 說明 |
---|---|
URL | /upload |
METHOD | POST |
請求數據 | form文件中二進制數據 |
響應數據 | 無 |
請求示例:數據庫
curl --form "fileupload=@22.txt" http://localhost:8086/upload
代碼處理:json
http.HandleFunc("/upload", UploadFile) //文件上傳 func UploadFile(w http.ResponseWriter, r *http.Request) { f, h, err := r.FormFile("fileupload") if err != nil { panic(err) } dirname := "../file/" + h.Filename file, err := os.Create(dirname) if err != nil { panic(err) } _, err = io.Copy(file, f) if err != nil { panic(err) } defer file.Close() fmt.Println(h) //w.Write([]byte("upload success")) //寫到 數據庫 中 fmt.Println(h.Filename, dirname, h.Size) MgSess.UploadFile(h.Filename, h.Filename, h.Size) } //mongo處理 func (m *MongoSessin) UploadFile(title, dir string, length int64) error { fmt.Println("call UploadFile") table := m.Session.DB("myblog").C("blogs") return table.Insert(&BlogInfo{title, length, dir}) }
對於發表的多篇博客,有一個列表的展現功能後端
http接口設計:服務器
名稱 | 說明 |
---|---|
URL | /lists |
METHOD | GET |
請求數據 | |
響應數據 | [{title,length,filedir},{title,length,filedir}] |
請求舉例:session
curl http://localhost:8086/lists
響應示例:curl
[{"Title":"11.txt","Length":16,"FileDir":"11.txt"},{"Title":"22.txt","Length":21,"FileDir":"22.txt"}]
http.HandleFunc("/lists", Lists) //路由函數 func Lists(w http.ResponseWriter, r *http.Request) { s, err := MgSess.Lists() if err != nil { panic(err) } fmt.Println(s) data, err := json.Marshal(s) fmt.Println(string(data)) w.Write(data) } //mongo處理 func (m *MongoSessin) Lists() ([]BlogInfo, error) { fmt.Println("call Lists") var blogInfos []BlogInfo err := m.Session.DB("myblog").C("blogs").Find(nil).All(&blogInfos) return blogInfos, err }
對於某一篇博文,能夠查看詳細內容,這個就要將以前的博客文件傳遞給前端。函數
http接口設計:
名稱 | 說明 |
---|---|
URL | /:filename |
METHOD | GET |
請求數據 | |
響應數據 | 文件內容 |
請求舉例:
curl http://localhost:8086/22.txt
文件服務
http.Handle("/", http.FileServer(http.Dir("../file/")))
所有代碼
/* main.go yekai pdj */ package main import ( "fmt" "net/http" //"gopkg.in/mgo.v2/bson" ) func main() { fmt.Println("blog begin ...") MgSess = &MongoSessin{} MgSess.Connect("localhost:27017") http.HandleFunc("/ping", Pong) http.HandleFunc("/upload", UploadFile) http.HandleFunc("/lists", Lists) http.Handle("/", http.FileServer(http.Dir("../file/"))) http.ListenAndServe(":8086", nil) } /* router.go yekai pdj */ package main import ( "encoding/json" "fmt" "io" "net/http" "os" ) func Pong(w http.ResponseWriter, r *http.Request) { w.Write([]byte("pong")) } func UploadFile(w http.ResponseWriter, r *http.Request) { f, h, err := r.FormFile("fileupload") if err != nil { panic(err) } dirname := "../file/" + h.Filename file, err := os.Create(dirname) if err != nil { panic(err) } _, err = io.Copy(file, f) if err != nil { panic(err) } defer file.Close() fmt.Println(h) //w.Write([]byte("upload success")) //寫到 數據庫 中 fmt.Println(h.Filename, dirname, h.Size) MgSess.UploadFile(h.Filename, h.Filename, h.Size) } func Lists(w http.ResponseWriter, r *http.Request) { s, err := MgSess.Lists() if err != nil { panic(err) } fmt.Println(s) data, err := json.Marshal(s) fmt.Println(string(data)) w.Write(data) } /* blog.go yekai pdj */ package main import ( "fmt" "gopkg.in/mgo.v2" ) type MongoSessin struct { Session *mgo.Session } var MgSess *MongoSessin type BlogInfo struct { Title string Length int64 FileDir string } func (m *MongoSessin) Connect(url string) { session, err := mgo.Dial(url) if err != nil { panic(err) } m.Session = session } func (m *MongoSessin) UploadFile(title, dir string, length int64) error { fmt.Println("call UploadFile") table := m.Session.DB("myblog").C("blogs") return table.Insert(&BlogInfo{title, length, dir}) } func (m *MongoSessin) Lists() ([]BlogInfo, error) { fmt.Println("call Lists") var blogInfos []BlogInfo err := m.Session.DB("myblog").C("blogs").Find(nil).All(&blogInfos) return blogInfos, err }
以上就是博客系統後端接口的所有內容,再搭配上一套好看的前端界面就能夠使用啦。親自寫過golang代碼,纔會真正的體會到go語言的優勢,快來學習吧。