为了账号安全,请及时绑定邮箱和手机立即绑定

手把手教你写第一个 Golang 接口

标签:
Go 接口测试

图片描述

User 登录接口

文件目录结构

- src
  - user
    - TbUserController.go   --------------- user 模块控制器
    - TbUserService.go   ----------------- user 逻辑层 
    - TbUserDao.go -------------------- user 数据操作层
    - TbUser.go ----------------------- user 数据模型层
- main.go --------------------------------- 入口文件

main.go 入口文件

http.Server 是 golang 自带 http 服务类,http.Server{ Addr: ":8899" } 表示监听来自 localhost:8899 端口请求;s.ListenAndServe() 表示持续监听

import (
	"net/http"
	"user"
)

func main() {
	s := http.Server{ Addr: ":8899" } 

	// 调用所有user模块 handle
	user.UserHandle()
	
	s.ListenAndServe()
}

TbUserController - user 模块控制器

程序从 main.go 进入 user.UserHandle() 方法,我们从方法内部定义好路由 /loginLoginController() 方法绑定。使得请求 http://localhost:8899/login 调起 LoginController() 执行

import (
	"encoding/json"
	"net/http"
)

// 所有 user 模块 handle
func UserHandle()  {
	http.HandleFunc( "/login", LoginController )
}

// 登陆控制器
func LoginController( w http.ResponseWriter, r *http.Request ) {
	username := r.FormValue( "un" ) // 接收参数
	pwd := r.FormValue( "pwd" )

	er := LoginService( username, pwd ) // 登陆逻辑

	b, _ := json.Marshal( er )  // 结构转对象
	w.Header().Set( "Content-Type", "application/json;charset=utf-8" )
	w.Write( b )
}

TbUserService.go - 登陆逻辑

将请求传递的 un 用户名 & pwd 密码,传入数据操作层进行数据库查询是否存在该用户,密码是否一致后。判断返回结果给页面

import "commons"

// 登陆逻辑
func LoginService( un, pwd string ) ( er commons.EgoResult ) {
	u := SelBuUnPedDao( un, pwd ) // 数据操作层
	if u != nil {
		er.Status = 200
	}else{
		er.Status = 400
	}

	return er
}

TbUserDao.go - 数据操作层

un 用户名 & pwd 密码 查询数据库

import (
	"commons"
	"fmt"
)

// 更加用户名,密码查询
func SelBuUnPedDao( un, pwd string ) *TbUser {
	sql := "select * from tb_user where username=? and password=? or email=? and password=? or phone=? and password=?"
	rows, err := commons.Dql( sql, un, pwd, un, pwd, un, pwd )
	if err != nil {
		fmt.Println( err )
		return nil
	}

	if rows.Next() {            // 因为这里只有一个,多个需要for
		user := new( TbUser )   // TbUser 结构充当数传输类
		rows.Scan( &user.Id, &user.Username, &user.Password, &user.Phone, &user.Email, &user.Created, &user.Updated )

		commons.CloseConn()
		return user
	}
	return nil
}

TbUser.go - 数据传输类

package user

type TbUser struct {
	Id int64
	Username string
	Password string
	Phone	string
	Email	string
	Created	string
	Updated	string
}

DBUtils.go - 数据库工具类

package commons

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"fmt"
)

var (
	db *sql.DB
	stmt *sql.Stmt
	rows *sql.Rows
)

func openConn() ( err error ) {
	db, err = sql.Open( "mysql", "root@tcp(localhost:3306)/packagist" )
	if err != nil {
		fmt.Println( "数据库链接错误,", err )
		return
	}
	return nil
}

func CloseConn() ( err error ) {
	if rows != nil {
		rows.Close()
	}

	if stmt != nil {
		stmt.Close()
	}

	if db != nil {
		db.Close()
	}

	return
}

// sql, 不定参数
func Dml( sql string, args ... interface{}) ( int64, error ) {
	err := openConn()
	if err != nil {
		fmt.Println( "执行 DML 出现错误" )
		return 0, err
	}

	stmt, err = db.Prepare( sql )
	if err != nil {
		fmt.Println( "预处理 DML 出现错误" )
		return 0, err
	}

	// 此处需要 ... 表示切片,如果没有表示数组,会报错
	ret, err := stmt.Exec( args ... )
	if err != nil {
		fmt.Println( "执行 DML 出现错误" )
		return 0, err
	}

	// 此处需要 ... 表示切片,如果没有表示数组,会报错
	count, err := ret.RowsAffected()
	if err != nil {
		fmt.Println( "获取影响行数出现错误" )
		return 0, err
	}


	CloseConn()
	return count, err
}


func Dql( sql string, args ... interface{}) ( *sql.Rows, error ) {
	err := openConn()
	if err != nil {
		fmt.Println( "执行 DML 出现错误" )
		return nil, err
	}

	stmt, err = db.Prepare( sql )
	if err != nil {
		fmt.Println( "预处理 DML 出现错误" )
		return nil, err
	}

	// 此处需要 ... 表示切片,如果没有表示数组,会报错
	rows, err := stmt.Query( args ... )
	if err != nil {
		fmt.Println( "执行 DML 出现错误" )
		return nil, err
	}


	// 此处没关闭, 调用时需要注意关闭
	return rows, nil
}

EgoResult.go - 结果返回类

package commons

type EgoResult struct {
	Status int
}
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消