继Golang学习系列第四天:操作数据库PostgreSQL,今天开始学习Golang和PostgreSQL开发 RESTful API接口,以Gorilla 为例。
1. 前言
我们经常会用csdn、博客园、掘金、抖音、infoq、medium等写文稿分享,我就以此写个这样的restful api接口,我写的是前后端分离式的接口(至于他们的是不是前后端一起或分离我就不知道了,也不想考究)。
一篇文章会有标题、子标题、摘要、背景图片、具体内容、文章分类、文章标签、文章作者(可能是联名写的,就像写书时多名作者)、发布时间、更新时间、文章类型(自己写的、转载的、或翻译老外的(比如掘金上就有不少))、是否置顶、是否被推荐、预计读的时间、浏览量、文章状态(拟稿、已发布、已逻辑删除)。
2. 构建文章 restful api 接口
注:我只写基本的文章api接口
2.1 建库建表
进入到数据库环境中,创建数据库csdn,然后创建文章表结构,我没有使用那么多字段列。
[root@master ~]# psql -h 192.168.8.200 -p 5432 -U postgres
psql (12.3)
Type "help" for help.
postgres=# CREATE DATABASE csdn;
CREATE DATABASE
postgres=# \c csdn
You are now connected to database "csdn" as user "postgres".
csdn=# CREATE TABLE article (
csdn(# id SERIAL PRIMARY KEY,
csdn(# title char(100),
csdn(# content text,
csdn(# category text ARRAY[4],
csdn(# tag text ARRAY[4],
csdn(# type char(10),
csdn(# author text ARRAY[10]
csdn(# );
CREATE TABLE
csdn=# INSERT INTO article VALUES (1,
csdn(# 'Golang学习系列第五天: Golang和PostgreSQL开发 RESTful API',
csdn(# '用go和postgresql开发restful api接口的过程',
csdn(# ARRAY['golang','postgresql'],
csdn(# ARRAY['golang', 'go','postgresql'],
csdn(# '原创',
csdn(# ARRAY['dongguangming', 'dgm']
csdn(# );
INSERT 0 1
csdn=# select * from article;
id | title | conte
nt | category | tag | type | author
----+-----------------------------------------------------------------------------------------------------------------+-----------------------
--------------------+---------------------+------------------------+--------------+---------------------
1 | Golang学习系列第五天: Golang和PostgreSQL开发 RESTful API | 用go和postgresql开发re
stful api接口的过程 | {golang,postgresql} | {golang,go,postgresql} | 原创 | {dongguangming,dgm}
(1 row)
csdn=#
2. 2 开始golang开发接口
2.2.1 新建工程csdn
建工程目录csdn,并创建相应的子文件夹(类似于mvc那套结构)
[root@master ~]# cd /dongguangming/goworkspace/
[root@master goworkspace]# pwd
/dongguangming/goworkspace
[root@master goworkspace]# mkdir csdn csdn/{models,middlewares,responses,api}
[root@master goworkspace]# cd csdn/
然后初始化自定义模块
go mod init csdn
查看对应的目录结构
接着创建具体的实物model,http响应数据格式,数据库连接
2.2.2 新建文章实体
先建article.go文件
[root@master csdn]# touch models/article.go
,键入以下代码
package models
import (
"errors"
"github.com/jinzhu/gorm"
"strings"
)
type Article struct {
gorm.Model
Title string `gorm:"size:100;not null;unique" json:"title"`
Content string `gorm:"not null" json:"content"`
Category string `gorm:"size:50;not null" json:"category"`
Tag string `gorm:"size:50;not null" json:"tag"`
Author string `gorm:"size:50;not null" json:"author"`
}
func (article *Article) Prepare() {
article.Title = strings.TrimSpace(article.Title)
article.Content = strings.TrimSpace(article.Content)
article.Category = strings.TrimSpace(article.Category)
article.Tag = strings.TrimSpace(article.Tag)
article.Author = strings.TrimSpace(article.Author)
}
func (article *Article) Validate() error {
if article.Title == "" {
return errors.New("Name is required")
}
if article.Content == "" {
return errors.New("Description about ven