go語言打造我的博客系統(二)

go語言打造我的博客系統(二)



  在上篇文章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語言的優勢,快來學習吧。



image

相關文章
相關標籤/搜索