欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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语言的优点,快来学习吧。



go语言打造个人博客系统(二)