文档章节

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

萧沐垚
 萧沐垚
发布于 2017/01/11 23:26
字数 1001
阅读 83
收藏 0

背景提要

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

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

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

文章目的:

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

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

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

搭建Go环境

此文不叙

简单项目架构

这里写图片描述


代码分析

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     

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

这里写图片描述

调用请求

用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

小功告成!

待续

© 著作权归作者所有

萧沐垚
粉丝 3
博文 20
码字总数 22908
作品 0
南京
程序员
私信 提问
用 Promise 讲一个悲伤的故事给你听

小编有话说:悲剧 总是更容易被人记住,所以今天用讲故事的方式,来简单的讲一下promise的使用~本文由banxi发表在掘金,已授权奇舞周刊转载 那天我正在学习 Promise,突然家里打电话过来说,家...

奇舞周刊
2018/07/01
0
0
大前端 Android 开发日记 10:微信分享

大前端 Android 开发日记 10:微信分享 Blog | Phodal Geek's Life2017-12-241 阅读 Android 与之前的微博分享相比,微信分享就没有那么容易了——微信官方的 SDK 太差劲了。文章也写得像一坨...

Blog | Phodal Geek's Life
2017/12/24
0
0
大前端 Android 开发日记七:MPAndroidChat 填坑笔记

大前端 Android 开发日记七:MPAndroidChat 填坑笔记 Blog | Phodal Geek's Life2017-12-241 阅读 Android 继续上一天的 MPAndroidChat 填坑记录。 MPAndroidChat 自定义 Marker 首先,是自定......

Blog | Phodal Geek's Life
2017/12/24
0
0
前端历程(一)------初识前端

前言 刚刚接触前端这一概念和基础知识是大一下学期的时候,有一门课程叫做客户端技术。起初只是把它当做一门一般的非考试课对待,上课也不认真听,到最后结课让提交大作业时,也是因为巧合之...

Betray.
2018/11/10
0
0
这到底是谁之错?

故事一: 背景介绍:RT是一个外包公司,ZWZX是项目承接公司,YD是甲方。 RT公司每天下班的时候都会接到ZWZX负责人的电话,询问一天的工作情况,然后布置任务要求晚上加班做完,RT公司的员工很...

虫虫
2012/04/19
3K
31

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部