golang基于gin实现简单api服务

golang基于gin实现简单api服务,第1张

golang版本:1.15

go代码

主程序

/* -*- coding:utf-8 -*-
author: cyz
time: 2022/1/5 15:32
*/

package main

import (
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis"
	"os/exec"
	"src/internal/pkg/login"
	"strings"
)


func runPythonFileInCMD(py_file_path string,args ...string) interface{} {
	//py_file_path = "E:/Program/GoProject/src/internal/pkg/login/sql_login.py"
	py_file_name := strings.Split(py_file_path,"/")[len(strings.Split(py_file_path,"/")) -1] //切分字符与list切片
	program_path := strings.Replace(py_file_path,py_file_name,"",-1) // 替换字符
	//attributes := "" //默认参数
	//if len(args) > 0 {
	//	attributes = `"` + strings.Join(args[:], `" "`) + `"`
	//}
	//command := fmt.Sprintf(`%s  %s `,py_file_name, attributes) //字符format方法
	command := append([]string{py_file_name}, args...)
	cmd := exec.Command("python",command...) // cmd命令使用方法
	cmd.Dir = program_path                     // cmd命令执行根目设置
	out, err := cmd.Output()                  // cmd命令执行
	if err != nil {                           // 返回结果判读
		fmt.Println("Error: ", err)
	}
	result := string(out)
	fmt.Println(result)
	var dat interface{}
	err = json.Unmarshal([]byte(result), &dat)
	if err == redis.Nil || err != nil {
		fmt.Println("转换成json错误: : ",err)
		return nil
	}
	return dat
}

//

func md5V(str string) string  {
	h := md5.New()
	h.Write([]byte(str))
	return hex.EncodeToString(h.Sum(nil))
}

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {

		db, err := login.Engine_3308()
		if err != nil {
			fmt.Println("数据库链接错误", err)
		}
		//defer db.Close() // 延时关闭
		stmtOut := db.QueryRow("SELECT VERSION()")
		db.Close()
		var doc string
		stmtOut.Scan(&doc)

		c.JSON(200, gin.H{
			"mysql VERSION": doc,
		})
	})

	r.GET("/addr", func(c *gin.Context) {
		addr := c.DefaultQuery("addr","")
		GCJ02 :=runPythonFileInCMD("E:/Program/projects_etl/api封装层容器/src/空间类/地址经纬度返回.py", addr)
		//GCJ02 :=runPythonFileInCMD("E:/Program/GoProject/src/internal/pkg/login/sql_login.py", "",addr)

		c.JSON(200, gin.H{
			"addr": addr,
			"GCJ02":GCJ02,
		})
	})


	//r.GET("/addr", func(c *gin.Context) {
	//	addr := c.Query("addr")
	//	addr_md5 := md5V(addr)
	//
	//	c.JSON(200, gin.H{
	//		"message": addr,
	//		"addr_md5":addr_md5,
	//	})
	//})

	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
	// http://localhost:8080/addr?addr=深圳南山

}


login_mysql

package login

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

// 通过首字母大小写来控制的(包括函数和变量),大写表示可以被其他包访问,小写则不可以。
func Engine_3308() (conn *sql.DB,err error)  {
	host := "1.1.1.1"
	user := "user"
	password := "password"
	db := "db_test"
	port := 3308
	charset := "utf8mb4"
	data_source_name := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True",
		user,password,host,port,db,charset)
	conn, err = sql.Open("mysql", data_source_name)
	if err != nil {
		fmt.Println("数据库链接错误", err)
		return nil, err
	}
	//fmt.Println(reflect.TypeOf(db).String()) // 查询变量类型
	return conn, err
}

redis_login

/* -*- coding:utf-8 -*-
author: cyz
time: 2022/1/13 9:54
*/

package login

import (
	"encoding/json"
	"fmt"
	"strings"
	"time"
	"github.com/go-redis/redis"
)

var (
	client = &redisCluterClient{}
)

//RedisClusterClient struct
type redisCluterClient struct {
	c *redis.ClusterClient
}

//GetClient get the redis client
func initialize(hostnames string) *redisCluterClient {
	addr := strings.Split(hostnames, ",")
	c := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: addr,
	})
	if err := c.Ping().Err(); err != nil {
		panic("Unable to connect to redis " + err.Error())
	}
	client.c = c
	return client
}

//GetKey get key
//func (client *redisCluterClient) getKey(key string, src interface{}) error {
//	val, err := client.c.Get(key).Result()
//	if err == redis.Nil || err != nil {
//		return err
//	}
//	err = json.Unmarshal([]byte(val), &src)
//	if err != nil {
//		return err
//	}
//	return nil
//}

//SetKey set key
//func (client *redisCluterClient) setKey(key string, value interface{}, expiration time.Duration) error {
//	cacheEntry, err := json.Marshal(value)
//	if err != nil {
//		return err
//	}
//	err = client.c.Set(key, cacheEntry, expiration).Err()
//	if err != nil {
//		return err
//	}
//	return nil
//}

type valueEx struct {
	Name  string
	Email string
}

//	a,_ :=json.Marshal("value")
//	typeOfA := reflect.TypeOf(a)
//	fmt.Println(typeOfA.Name(), typeOfA.Kind())
func ConnectRedis(hostnames string) *redisCluterClient{
	redisCluterClient := initialize(hostnames)
	return redisCluterClient
}

func (client *redisCluterClient) getKey(key string) (src interface{},err error){
	val, err := client.c.Get(key).Result()
	//fmt.Println(reflect.TypeOf(val).String())
	if err == redis.Nil || err != nil {
		fmt.Println("redis获取数据错误: ",err)
		return nil, err
	}
	err = json.Unmarshal([]byte(val), &src)
	if err == redis.Nil || err != nil {
		fmt.Println("转换成json错误: : ",err)
		return nil, err
	}
	return src, err
}

func (client *redisCluterClient) setKey(key string, value interface{}, expiration time.Duration) error {
	cacheEntry, err := json.Marshal(value)
	if err != nil {
		return err
	}
	err = client.c.Set(key, cacheEntry, expiration).Err()
	if err != nil {
		return err
	}
	return nil
}

//func main() {
//	//Use your actually ip address here
//	//redisCluterClient := initialize("1.1.1.1:0000,1.1.1.1:0001,1.1.1.1:0002,")
//	//redisCluterClient := initialize("1.1.1.1:0000")
//	//key1 := "manager-system:test-golang-login"
//	//value1 := &valueEx{Name: "someName", Email: "someemail@abc.com"}
//	//err := redisCluterClient.setKey(key1, value1, time.Minute*1)
//	//if err != nil {
//	//	log.Fatalf("Error: %v", err.Error())
//	//}
//	//value2 := &valueEx{}
//	//err = redisCluterClient.getKey(key1, value2)
//	//if err != nil {
//	//	log.Fatalf("Error: %v", err.Error())
//	//}
//	//log.Printf("Name: %s", value2.Name)
//	//log.Printf("Email: %s", value2.Email)
//
//	cr := ConnectRedis("1.1.1.1:0000")
//	key1 := "manager-system:test-golang-login"
//	value1 := &valueEx{Name: "someName", Email: "someemail@abc.com"}
//	err := cr.setKey(key1, value1, time.Minute*1)
//	if err != nil {
//		fmt.Println(err)
//	}
//	val, err :=cr.getKey(key1)
//	fmt.Println(val, err)
//
//}
使用goland生成到linux运行文件。

参考文章:https://blog.csdn.net/baidu_34122324/article/details/90183394?utm_term=golang%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2%E8%BF%90%E8%A1%8C&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-0-90183394&spm=3001.4430
参考文章:https://blog.csdn.net/weixin_42223531/article/details/107253727
参考文章:https://bbs.huaweicloud.com/forum/thread-132461-1-1.html

GOARCH=amd64;GOOS=linux

然后运行,运行后会生成linux的文件。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/996395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存