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

栏目: Go · 发布时间: 5年前

内容简介:在上篇文章博客上传正常需要传递很多文本,这个字符串存储不太理想,习惯上会把博客内容形成一个文件,将文件信息存储到后端服务器当中http接口设计:

在上篇文章 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语言打造个人博客系统(二)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JAVA多线程设计模式

JAVA多线程设计模式

结城 浩、博硕文化 / 博硕文化 / 中国铁道出版社 / 2005-4-1 / 49.00元

《JAVA多线程设计模式》中包含JAVA线程的介绍导读,12个重要的线程设计模式和全书总结以及丰富的附录内容。每一章相关线程设计模式的介绍,都举一反三使读者学习更有效率。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的精华,书中最后附上练习问题解答,方便读者学习验证。一起来看看 《JAVA多线程设计模式》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试