一、依赖
module main
go 1.15
require (
github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.3.0 // indirect
github.com/golang/protobuf v1.4.2 // indirect
github.com/jinzhu/gorm v1.9.16
github.com/json-iterator/go v1.1.10 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/ugorji/go v1.1.8 // indirect
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff // indirect
google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
)
二、代码
package main
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
//国内镜像 https://learnku.com/go/wikis/38122
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"time"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
//变量
var (
Database *gorm.DB
)
//变量
var _ = log.Printf
type Book struct {
ID int // 列名为 `id`
Name string `gorm:"size:255"` // 列名为 `name`
Port int // 列名为 `port`
}
func init() {
//创建一个数据库的连接
var err error
db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
db.SingularTable(true)
if err != nil {
panic("failed to connect database")
}
//迁移the schema
db.AutoMigrate(&Book{
})
Database = db
}
//启动
func main() {
router := gin.Default()
router.POST("/book", creatBook)
router.GET("/books", fetchAllBooks)
router.GET("/book/:id", updateBook)
router.PUT("/book/:id", fetchSingleBook)
router.DELETE("/book/:id", deleteBook)
router.POST("/upload_file", HandleUploadFile)
router.POST("/upload_muti_file", HandleUploadMutiFile)
router.GET("/download", HandleDownloadFile)
router.GET("/getUrl", Get)
router.Run(":7001")
}
// 查询所有
func fetchAllBooks(c *gin.Context) {
var dataList []Book
Database.Find(&dataList)
if len(dataList) <= 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": -1, "result": nil, "message": "No todo found!"})
return
}
c.JSON(200, gin.H{
"status": 1, "result": dataList, "message": "Success"})
}
//查询
func fetchSingleBook(c *gin.Context) {
var data Book
id := c.Param("id")
Database.First(&data, id)
err := c.ShouldBind(&data)
if err != nil {
c.JSON(200, gin.H{
"status": -1, "result": nil, "message": err.Error()})
} else {
if data.ID == 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound, "result": nil, "message": "No todo found!"})
return
}
Database.Model(&data).Updates(&data)
c.JSON(200, gin.H{
"status": 1, "result": data, "message": "Success"})
}
}
//更新
func updateBook(c *gin.Context) {
var data Book
id := c.Param("id")
Database.First(&data, id)
if data.ID == 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound, "result": nil, "message": "No todo found!"})
return
}
Database.Model(&data).Updates(&data)
c.JSON(200, gin.H{
"status": 1, "result": data, "message": "Success"})
}
//创建
func creatBook(c *gin.Context) {
var book Book
err := c.ShouldBind(&book)
if err != nil {
c.JSON(200, gin.H{
"status": -1, "result": nil, "message": err.Error()})
} else {
Database.Save(&book)
c.JSON(200, gin.H{
"status": 1, "result": book, "message": "Success"})
}
}
//删除
func deleteBook(c *gin.Context) {
var data Book
todoID := c.Param("id")
Database.First(&data, todoID)
if data.ID == 0 {
c.JSON(http.StatusNotFound, gin.H{
"status": http.StatusNotFound, "message": "No todo found!"})
return
}
Database.Delete(&data)
c.JSON(200, gin.H{
"status": 1, "result": data, "message": "Success"})
}
//错误
func handleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 发送GET请求
// url: 请求地址
// response: 请求返回的内容
func Get(c *gin.Context) {
url := c.Param("url")
// 超时时间:5秒
client := &http.Client{
Timeout: 5 * time.Second}
resp, err := client.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var buffer [512]byte
result := bytes.NewBuffer(nil)
for {
n, err := resp.Body.Read(buffer[0:])
result.Write(buffer[0:n])
if err != nil && err == io.EOF {
break
} else if err != nil {
panic(err)
}
}
c.JSON(200, gin.H{
"status": 1, "result": result.String(), "message": "Success"})
}
// HandleUploadFile 上传单个文件
func HandleUploadFile(c *gin.Context) {
file, header, err := c.Request.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "文件上传失败"})
return
}
content, err := ioutil.ReadAll(file)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "文件读取失败"})
return
}
fmt.Println(header.Filename)
fmt.Println(string(content))
c.JSON(http.StatusOK, gin.H{
"msg": "上传成功"})
}
// HandleUploadMutiFile 上传多个文件
func HandleUploadMutiFile(c *gin.Context) {
// 限制上传文件大小
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 4<<20)
// 限制放入内存的文件大小
err := c.Request.ParseMultipartForm(4 << 20)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "文件读取失败"})
return
}
formdata := c.Request.MultipartForm
files := formdata.File["file"]
for _, v := range files {
file, err := v.Open()
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "文件读取失败"})
return
}
defer file.Close()
content, err := ioutil.ReadAll(file)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "文件读取失败"})
return
}
fmt.Println(v.Filename)
fmt.Println(string(content))
}
c.JSON(http.StatusOK, gin.H{
"msg": "上传成功"})
}
// HandleDownloadFile 下载文件
func HandleDownloadFile(c *gin.Context) {
content := c.Query("content")
content = "hello world, 我是一个文件," + content
c.Writer.WriteHeader(http.StatusOK)
c.Header("Content-Disposition", "attachment; filename=hello.txt")
c.Header("Content-Type", "application/text/plain")
c.Header("Accept-Length", fmt.Sprintf("%d", len(content)))
c.Writer.Write([]byte(content))
}
三、sql脚本
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`port` int(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;