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

背景提要

① 前端开发工程师,完成了项目A的前端工作,包括页面及接口对接,含html+css+js及php层

② 出于职业规划,负责担任项目B的Server层开发,初次接触Go语言

③ 毕设项目为:JavaWeb搭建的一套系统,了解从【数据库–JDBC–server–页面】的运行逻辑

文章目的:

搭建http服务端,完成第一个GoServer层接口Connect

接口说明:判定数据库是否连接成功

接口流程:前端发送请求到指定URL,返回结果

搭建Go环境

此文不叙

简单项目架构

前端眼中的Go→我的第一个GO接口(一)_第1张图片


代码分析

main.go

package main

import (
    "fmt"
    "dao"
)

func main() {
    fmt.Print("预备加载BI服务 ......\n")
    dao.RegisterAPIRouter()
}

main(主)服务执行文件,从代码可以看出,当加载main()方法后,调用了dao.RegisterAPIRouter()方法,这里dao是一个包,RegisterAPIRouterdao包中的一个方法。可以看到import的有dao这个包。

go的规则简单理解为,import即引入某个包后,即可以调用该包中的全局方法(大写开头的方法),不以包下的文件名做区分,只要是dao下的全局方法,都可以以dao.xxx的形式调用。

router.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/connectget和post请求,对应方法:ConnTest,监听端口为9000。而ConnTest方法在dao下的datasource.go中,触发监听时,会调用此方法。

datasource.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

GOPATHPATH环境变量一样,也可以接受多个路径,并且路径和路径之间用冒号分割。

3.设置完GOPATH后,开始编译(构建)项目。

假设我们希望把生成的可执行文件放到projectB/bin目录中,需要执行的一系列指令如下:

$ cd ~/gotest/projectB/bin
//runserver为我们主程序main.go所在的文件夹名称 
$ go build runserver       

可以看到生成了名为一个runserver的文件,执行它即启动了projectB

 //启动服务
./runserver     

执行后的结果,以及服务监听的反馈

前端眼中的Go→我的第一个GO接口(一)_第2张图片

调用请求

用postman发送请求

示例url:

127.0.0.1:9000/data/source/connect?dbname=mysql&user=admin&password=admin&host=127.0.0.1&port=3306&dbtype=mysql

返回结果如图所示:

这里写图片描述

结语

至此我的第一个GoServer接口就完成了:ip:port/data/source/connect

小功告成!

待续

你可能感兴趣的:(go)