go语言打造个人博客系统(二)
程序员文章站
2023-01-14 22:13:26
go语言打造个人博客系统(二) 在上篇文章 "go语言打造个人博客系统(一)" 中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发。 博客系统后端接口开发 路由测试 上传博客 博客上传正常需要传递很多文本,这个字符串存 ......
go语言打造个人博客系统(二)
在上篇文章中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发。
博客系统后端接口开发
- 路由测试
http.handlefunc("/ping", pong)
func pong(w http.responsewriter, r *http.request) { w.write([]byte("pong")) }
- 上传博客
博客上传正常需要传递很多文本,这个字符串存储不太理想,习惯上会把博客内容形成一个文件,将文件信息存储到后端服务器当中
http接口设计:
名称 | 说明 |
---|---|
url | /upload |
method | post |
请求数据 | form文件中二进制数据 |
响应数据 | 无 |
请求示例:
curl --form "fileupload=@22.txt" http://localhost:8086/upload
代码处理:
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}] |
请求举例:
curl http://localhost:8086/lists
响应示例:
[{"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语言的优点,快来学习吧。
上一篇: RRMine/人人矿场构筑全球算力基础设施,助推区块链发展
下一篇: 遇到一个渣女