我的第一个GO接口←一个前端眼中的GO(一)

2017-01-12 09:56:59来源:oschina作者:萧沐垚人点击



> **背景提要**:
>
> ① 前端开发工程师,完成了项目A的前端工作,包括页面及接口对接,含html+css+js及php层
>
> ② 出于职业规划,负责担任项目B的Server层开发,初次接触Go语言
>
> ③ 毕设项目为:JavaWeb搭建的一套系统,了解从【数据库--JDBC--server--页面】的运行逻辑
>
> **文章目的:**
>
> 搭建http服务端,完成第一个GoServer层接口Connect
>
> 接口说明:判定数据库是否连接成功
>
> 接口流程:前端发送请求到指定URL,返回结果
## 搭建Go环境
此文不叙
## 简单项目架构
![这里写图片描述](http://img.blog.csdn.net/20170111230958570?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY4MDkzOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
---
## 代码分析
### main.go
```go
package main
import (
"fmt"
"dao"
)
func main() {
fmt.Print("预备加载BI服务 ....../n")
dao.RegisterAPIRouter()
}
```
main(主)服务执行文件,从代码可以看出,当加载`main()`方法后,调用了`dao.RegisterAPIRouter()`方法,这里`dao`是一个包,`RegisterAPIRouter`是`dao`包中的一个方法。可以看到`import`的有`dao`这个包。
go的规则简单理解为,`import`即引入某个包后,即可以调用该包中的全局方法(大写开头的方法),不以包下的文件名做区分,只要是`dao`下的全局方法,都可以以`dao.xxx`的形式调用。
### router.go
```go
package dao
import (
"github.com/gin-gonic/gin"
"net/http"
)
func RegisterAPIRouter() {
gin.SetMode(gin.DebugMode) //调试模式
router := gin.Default() //获得路由实例
routerDatasource := router.Group("/data/source")
// 监听/data/source/connect的get和post请求,对应方法:ConnTest
routerDatasource.GET("/connect", ConnTest)
routerDatasource.POST("/connect", ConnTest)

//监听端口
http.ListenAndServe(":9000", router)
}
```
这里引入了gin框架,更简便的搭建http服务器,监听url请求。上述代码监听`/data/source/connect`的`get和post`请求,对应方法:`ConnTest`,监听端口为9000。而`ConnTest`方法在`dao`下的`datasource.go`中,触发监听时,会调用此方法。
### datasource.go
```go
package dao
import (
"database/sql"
_ "github.com/lib/pq"
_ "github.com/go-sql-driver/mysql"
"github.com/gin-gonic/gin"
)
/**
* [测试连接数据库]
* @Author CaiYu
* @DateTime 2017-01-11T14:40:34+0800
* @param dbname 数据库名
* @param dbtype 数据库类型
* @param user 用户名
* @param password密码
* @param port 端口
* @param host 主机
*/
func ConnTest(c *gin.Context) {
var(
status int
desc string
)
dbtype := c.Query("dbtype")
dbname := c.Query("dbname")
user := c.Query("user")
password := c.Query("password")
host := c.Query("host")
port := c.Query("port")constr := user+":"+password+"@tcp("+host+":"+port+")/"+dbname
db, err := sql.Open(dbtype, constr)
err = db.Ping()//sql.Open无法断定数据库是否正常连接,所以调用db.Ping()进行判定
if err != nil {
status = 300
desc = "数据库连接失败"
}else{
status = 200
desc = "数据库连接成功"
}
c.JSON(200, gin.H{"status": status,"msg": desc})
}
```
`sql.Open()`不会创建连接 ,只是创建一个DB实例,所以执行`Open()`函数时,系统并不会去获得数据库连接的有效性,执行数据库操作的时候才会去连接。
当我们需要在`Open()`之后就知道连接的有效性时,可以通过`Ping()`来进行。如上述代码所示。
我们对`db.Ping()`的结果进行了一个err判定,对应赋值,将结果以json的形式返回,方便前端调用。
## 项目编译(构建)
1.先把该项目加入到环境变量`GOPATH`中。
假设projectB目录位于~/gotest下,则应编辑~/.bashrc文件,并添加下面这行代码:
`export GOPATH=~/gotest/projectB`
2.然后使路径生效:
`$ source ~/.bashrc`
`GOPATH`和`PATH`环境变量一样,也可以接受多个路径,并且路径和路径之间用冒号分割。
3.设置完GOPATH后,开始编译(构建)项目。
假设我们希望把生成的可执行文件放到`projectB/bin`目录中,需要执行的一系列指令如下:
```shell
$ cd ~/gotest/projectB/bin
//runserver为我们主程序main.go所在的文件夹名称
$ go build runserver
```
可以看到生成了名为一个`runserver`的文件,执行它即启动了projectB
```shell
//启动服务
./runserver
```
执行后的结果,以及服务监听的反馈
![这里写图片描述](http://img.blog.csdn.net/20170111230456828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY4MDkzOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)## 调用请求
用postman发送请求
示例url:
```json
127.0.0.1:9000/data/source/connect?dbname=mysql&user=admin&password=admin&host=127.0.0.1&port=3306&dbtype=mysql
```
返回结果如图所示:
![这里写图片描述](http://img.blog.csdn.net/20170111230510538?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY4MDkzOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
## 结语
至此我的第一个GoServer接口就完成了:`ip:port/data/source/connect`
小功告成!
待续

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台