postman post gin 接收不到_Go Web 框架 Gin 实践2—Gin搭建Blog API's (一)

本文介绍了使用Go Web框架Gin搭建Blog API的初步步骤,包括项目初始化、配置管理、错误码包编写和工具包设置。通过创建配置文件、错误码模块以及简单的Demo,展示了如何处理配置、API错误码和分页等公共参数。同时,文章讨论了Gin的相关知识点,如Gin.Default()、Context管理和http.Server的使用。
摘要由CSDN通过智能技术生成

Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!

项目地址:https://github.com/EDDYCJY/go-gin-example

8a3f0e67338528adf20b829dff760bef.png

01 思考

首先,在一个初始项目开始前,大家都要思考一下

  1. 各种的程序配置写在代码中,好吗
  2. API的错误码硬编在程序中,合适吗
  3. db句柄谁都去Open,好吗
  4. 获取分页等公共参数,不统一管理起来,好吗

显然在较正规的项目中,这些问题的答案都是不可以

为了解决这些问题,我们挑选一款读写配置文件的库,本系列中选用go-ini/ini ,它的中文文档。大家需要先简单阅读它的文档,再接着完成后面的内容。

我们还会编写一个简单的API错误码包,并且完成一个Demo示例和讲解知识点,便于后面的学习。

02 介绍和初始化项目

9edf227b7ef35ec7ce0bfb36c20c9287.png

初始工作区

首先,我们需要增加一个工作区(GOPATH)路径用于我们的Blog项目。

将你新的工作区加入到/etc/profile中的GOPATH环境变量中, 并在新工作区中,建立bin、pkg、src三个目录。

在src目录下创建gin-blog目录,初始的目录结构:

$GOPATH├── bin├── pkg└── src └── gin-blog

初始化项目目录

gin-blog/├── conf├── middleware├── models├── pkg├── routers└── runtime
  • conf:用于存储配置文件
  • middleware:应用中间件
  • models:应用数据库模型
  • pkg:第三方包
  • routers 路由逻辑处理
  • runtime 应用运行时数据

初始项目数据库

新建blog数据库,编码为utf8_general_ci

在blog数据库下,新建以下表

1、 标签表

3b567b66c3ba284746a78961a1e50199.png

2、 文章表

22657efda19d5eb46bda427beb8e9e7f.png

3、 认证表

007a3db18457bfd9d9f22639a5af0730.png

03 编写项目配置包

拉取go-ini/ini的依赖包

go get -u github.com/go-ini/ini

我们需要编写基础的应用配置文件,在gin-blog的conf目录下新建app.ini文件,写入内容:

#debug or releaseRUN_MODE = debug[app]PAGE_SIZE = 10JWT_SECRET = 23347$040412[server]HTTP_PORT = 8000READ_TIMEOUT = 60WRITE_TIMEOUT = 60[database]TYPE = mysqlUSER = 数据库账号PASSWORD = 数据库密码#127.0.0.1:3306HOST = 数据库IP:数据库端口号NAME = blogTABLE_PREFIX = blog_

建立调用配置的setting模块,在gin-blog的pkg目录下新建setting目录,新建setting.go文件,写入内容:

8bd4e7f92617c2b6d39c276d549a1ff2.png
88c4e5e679591ae26076a75b98605d0b.png

当前的目录结构:

gin-blog/├── conf│ └── app.ini├── middleware├── models├── pkg│ └── setting│ └── setting.go├── routers├── runtime

04 编写API错误码包

建立错误码的e模块,在gin-blog的pkg目录下新建e目录,新建code.go和msg.go文件,写入内容:

1、 code.go:

package econst (SUCCESS = 200ERROR = 500INVALID_PARAMS = 400ERROR_EXIST_TAG = 10001ERROR_NOT_EXIST_TAG = 10002ERROR_NOT_EXIST_ARTICLE = 10003ERROR_AUTH_CHECK_TOKEN_FAIL = 20001ERROR_AUTH_CHECK_TOKEN_TIMEOUT = 20002ERROR_AUTH_TOKEN = 20003ERROR_AUTH = 20004)

2、 msg.go:

ecfe8582f1016b991dd281162aa67a79.png

05 编写工具包

在gin-blog的pkg目录下新建util目录,

拉取com的依赖包

go get -u github.com/Unknwon/com

06 编写分页页码的获取方法

在util目录下新建pagination.go,写入内容:

be102a0b5d22ad03213301f28078e26b.png

07 编写models init

拉取gorm的依赖包

go get -u github.com/jinzhu/gorm

拉取mysql驱动的依赖包

go get -u github.com/go-sql-driver/mysql

完成后,在gin-blog的models目录下新建models.go,用于models的初始化使用

c7d643a59f5283e704a41576599f179f.png

08 编写项目启动、路由文件

最基础的准备工作完成啦,让我们开始编写Demo吧!

编写Demo

在gin-blog下建立main.go作为启动文件(也就是main包),

我们先写个Demo,帮助大家理解,写入文件内容:

9ab7a9061a37c66a29a3cfe07f4867ca.png

执行go run main.go,查看命令行是否显示

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env:export GIN_MODE=release - using code:gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /test --> main.main.func1 (3 handlers)

在本机执行curl 127.0.0.1:8000/test,检查是否返回{"message":"test"}。

09 知识点

b46febf710814f11289347e4bc52cef9.png

那么,我们来延伸一下Demo所涉及的知识点!

1、 标准库:

  • fmt:实现了类似C语言printf和scanf的格式化I/O。格式化动作('verb')源自C语言但更简单
  • net/http:提供了HTTP客户端和服务端的实现

2、 Gin:

  • gin.Default():返回Gin的type Engine struct{...},里面包含RouterGroup,相当于创建一个路由Handlers,可以后期绑定各类的路由规则和函数、中间件等
  • router.GET(...){...}:创建不同的HTTP方法绑定到Handlers中,也支持POST、PUT、DELETE、PATCH、OPTIONS、HEAD 等常用的Restful方法
  • gin.H{...}:就是一个map[string]interface{}
  • gin.Context:Context是gin中的上下文,它允许我们在中间件之间传递变量、管理流、验证JSON请求、响应JSON请求等,在gin中包含大量Context的方法,例如我们常用的DefaultQuery、Query、DefaultPostForm、PostForm等等

3、 &http.Server和ListenAndServe?

http.Server:

6abe9aa795678b7832ffcea5d307f678.png
  • Addr:监听的TCP地址,格式为:8000
  • Handler:http句柄,实质为ServeHTTP,用于处理程序响应HTTP请求
  • TLSConfig:安全传输层协议(TLS)的配置
  • ReadTimeout:允许读取的最大时间
  • ReadHeaderTimeout:允许读取请求头的最大时间
  • WriteTimeout:允许写入的最大时间
  • IdleTimeout:等待的最大时间
  • MaxHeaderBytes:请求头的最大字节数
  • ConnState:指定一个可选的回调函数,当客户端连接发生变化时调用
  • ErrorLog:指定一个可选的日志记录器,用于接收程序的意外行为和底层系统错误;如果未设置或为nil则默认以日志包的标准日志记录器完成(也就是在控制台输出)

ListenAndServe:

9b28baff701176e9ee2fbd8aa1f759d2.png

开始监听服务,监听TCP网络地址,Addr和调用应用程序处理连接上的请求。

我们在源码中看到Addr是调用我们在&http.Server中设置的参数,因此我们在设置时要用&,我们要改变参数的值,因为我们ListenAndServe和其他一些方法需要用到&http.Server中的参数,他们是相互影响的。

4、 http.ListenAndServe和连载一的r.Run()有区别吗?

我们看看r.Run的实现:

f4c8582d710fbbbcab18f07994ef4cfb.png

通过分析源码,得知本质上没有区别,同时也得知了启动gin时的监听debug信息在这里输出。

5、 为什么Demo里会有WARNING?

首先我们可以看下Default()的实现

a7d175548723ea7e22782b22f283dbeb.png

大家可以看到默认情况下,已经附加了日志、恢复中间件的引擎实例。并且在开头调用了debugPrintWARNINGDefault(),而它的实现就是输出该行日志

func debugPrintWARNINGDefault() {debugPrint(`[WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.`)}

而另外一个Running in "debug" mode. Switch to "release" mode in production.,是运行模式原因,并不难理解,已在配置文件的管控下 :-),运维人员随时就可以修改它的配置。

6、 Demo的router.GET等路由规则可以不写在main包中吗?

我们发现router.GET等路由规则,在Demo中被编写在了main包中,感觉很奇怪,我们去抽离这部分逻辑!

在gin-blog下routers目录新建router.go文件,写入内容:

e7bc6b579262b696e047b05a8db4d1c5.png

修改main.go的文件内容:

42f28af6c698db712ea142eb10588afd.png

当前目录结构:

895d30e2d83813da605ffb154eec61dd.png

重启服务,执行curl 127.0.0.1:8000/test查看是否正确返回。

下一节,我们将以我们的Demo为起点进行修改,开始编码!

10 参考

本系列示例代码

  • go-gin-example

本系列作者:煎鱼,原创授权发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值