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语言打造个人博客系统(二)的更多相关文章
- go语言打造个人博客系统(一)
go语言打造个人博客系统(一) 为什么选择go语言? 听说go语言是在几年前,但真正深入了解他却是在2017年,因为当时作为讲师 ,需要准备go语言的课程,结果稍一接触立刻就喜欢上这门语言了,作为 ...
- django初探-创建简单的博客系统(二)
上篇django初探-创建简单的博客系统(一)已经记录了Django实现博客的发布的整个过程,接下来继续说明博客标题和内容的显示. 显示博客详细 将博客内容保存到数据库还不是发布博客的终极目的,博客一 ...
- spring-boot序章:打造博客系统
blog 使用spring-boot打造一个博客系统,在项目中学习! 项目功能 文章 游览 创建 编辑 删除 评论 用户 游客 注册用户 关注 被关注 后台统计 注册用户数 在线人数 文章总数 评论总 ...
- django初探-创建简单的博客系统
django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...
- django初探-创建简单的博客系统(一)
django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...
- 如何快速部署国人开源的 Java 博客系统 Tale
除了闷头专研技术之外,程序员还需要不断地写作进行技术积累,写博客是其中最重要的方式之一.商业博客平台不少,但是更符合程序员背景的方案,是自己开发一个博客平台或者使用开源的博客平台. 开源的博客平台多如 ...
- 二、Java多人博客系统-演变
任何项目都是由小到大,逐步演变的.自己写的这个博客系统也不例外. 更新日志如下: 一.2014年底-2015年初 功能及技术: 1.定位为个人网站,介绍自己情况和发布文章等. 2.首页模块有:个人简介 ...
- 从入门到放弃,.net构建博客系统(二):依赖注入
文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行io ...
- Java语言课程设计——博客作业教学数据分析系统(201521123107 张翔)
#Java语言课程设计--博客作业教学数据分析系统(个人博客) 1.团队课程设计博客链接 [博客作业教学数据分析系统(From:网络五条狗)](http://www.cnblogs.com/fanta ...
随机推荐
- Java 生成 JNI 头文件
[参考文章]:javah javac 命令行生成native的方法教程 [参考文章]:用javah 导出类的头文件, 常见的错误及正确的使用方法 项目需要调用 C++动态库,由于项目包结构发生变化,需 ...
- [树莓派]启用root账户
树莓派使用的linux是debian系统,所以树莓派启用root和debian是相同的. debian里root账户默认没有密码,但账户锁定. 当需要root权限时,由默认账户经由sudo执行,Ras ...
- 【转】getopt模块,实现获取命令行参数
python中 getopt 模块,该模块是专门用来处理命令行参数的 函数getopt(args, shortopts, longopts = []) 参数args一般是sys.argv[1:],sh ...
- 【netty】(2)---搭建一个简单服务器
netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...
- 设计模式java实现合集
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 桥接模式:http://blog.csdn.net/jason05 ...
- git - 管理项目(SourceTree的使用)
Git 相关命令操作全 1.SourceTree 是什么? SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是M ...
- docker-swarm相关命令和注意事项
在k8s出现之后,docker-swarm使用的人越来越少,但在本地集成开发环境的搭建上,使用它还是比较轻量级的,它比docker-compose最大的好处就是容器之间的共享和服务的治理,你不需要li ...
- ES6躬行记(17)——Map
一.Map Map类似于Object(对象),可用来存储键值对,但需要通过SameValueZero算法保持键的唯一性.与Set一样,在使用之前也得要实例化,如下代码所示,构造函数Map()中的参数也 ...
- Docker 网络之理解 bridge 驱动
笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...
- Spring AOP中的JDK和CGLib动态代理哪个效率更高?
一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...