[golang gin framework] 40. Проект Gin mall - микросервис кода проверки Captcha в бою микросервисов

Этот контент требует базовых знаний о структуре gin и базовых знаний о микросервисах golang , чтобы лучше понять

1. Внедрение функции проверочного кода Captcha

В начале мы объяснили архитектуру микросервисов и т. Д. Здесь мы объясним микросервис кода проверки Captcha из предыдущего проекта торгового центра . Функция кода проверки Captcha используется на переднем плане и в бэкэнде . Его можно извлечь и преобразовать в микросервисная функция

редактировать

Эта функция кода подтверждения инкапсулирует код captcha.go следующим образом:

package models

//验证码属性: https://captcha.mojotv.cn/
import (
    "github.com/mojocn/base64Captcha"
    "image/color"
)

//创建store,保存验证码的位置,默认为mem(内存中)单机部署,如果要布置多台服务器,则可以设置保存在redis中
//var store = base64Captcha.DefaultMemStore

//配置RedisStore, 保存验证码的位置为redis, RedisStore实现base64Captcha.Store接口
var store base64Captcha.Store = RedisStore{}

//获取验证码
func MakeCaptcha(height int, width int, length int) (string, string, error) {
    //定义一个driver
    var driver base64Captcha.Driver
    //创建一个字符串类型的验证码驱动DriverString, DriverChinese :中文驱动
    driverString := base64Captcha.DriverString{
        Height:          height,                                     //高度
        Width:           width,                                    //宽度
        NoiseCount:      0,                                      //干扰数
        ShowLineOptions: 2 | 4,                                  //展示个数
        Length:          length,                                      //长度
        Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
        BgColor: &color.RGBA{ // 背景颜色
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"}, // 字体
    }
    driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    return id, b64s, err
}

//校验验证码
func VerifyCaptcha(id string, VerifyValue string) bool {
    // 参数说明: id 验证码id, verifyValue 验证码的值, true: 验证成功后是否删除原来的验证码
    if store.Verify(id, VerifyValue, true) {
        return true
    } else {
        return false
    }
}
Если вы превращаете этот проверочный код в микросервис, вам необходимо реализовать два вышеуказанных метода: получить проверочный код (MakeCaptcha), проверить проверочный код (VerifyCaptcha)

2. Создайте сервер микросервиса с проверочным кодом капчи.

  1. Создадим две папки, client (клиент), server (сервер)

  1. Сгенерировать код микросервиса captcha на стороне сервера

Запустите в каталоге сервера: go-micro new service captcha для генерации кода сервера captcha
После выполнения команды сгенерированный каталог сервера выглядит следующим образом:
  1. Записать файл proto/captcha.proto

Запишите в этот файл , чтобы получить код подтверждения и проверить код, связанный с кодом подтверждения.

syntax = "proto3";

package captcha;

option go_package = "./proto/captcha";

service Captcha {
    //获取验证码: MakeCaptchaRequest请求, MakeCaptchaRequest返回
    rpc MakeCaptcha(MakeCaptchaRequest) returns (MakeCaptchaResponse) {}
    //校验验证码: VerifyCaptchaRequest请求, VerifyCaptchaResponse返回
    rpc VerifyCaptcha(VerifyCaptchaRequest) returns (VerifyCaptchaResponse) {}
}

//以下具体参数类型参考captcha.go中对应的方法

//获取验证码请求参数
message MakeCaptchaRequest {
    //验证码高度
    int32 height =1;
    //验证码宽度
    int32 width = 2;
    //验证码长度
    int32 length = 3;
}

//获取验证码返回数据
message MakeCaptchaResponse {
    //验证码id
    string id = 1;
    //验证码base64编码
    string b64s = 2;
}

//校验验证码请求参数
message VerifyCaptchaRequest {
    //验证码id
    string id = 1;
    //输入的验证码
    string verifyValue = 2;
}

//校验验证码返回数据
message VerifyCaptchaResponse {
    //校验的结果
    bool verifyResult = 1;
}
  1. Создание файлов, связанных с прототипом

Обратитесь к [golang microservices] 7. Введение в структуру go-micro, строительные леса go-micro, go-micro в сочетании с консулом для создания случая микросервиса , запустите код под proto в Makefile под окнами : protoc --proto_path=. -- micro_out= . --go_out=:.proto/captcha.proto, конечно, если вы используете go-micro в первый раз, вам также необходимо запустить код ниже init (@go xxx) для импорта связанных пакетов

  1. Инициализировать проект

Запустите команду в директории с капчей: go mod init captcha , инициализируйте проект
После удаления go.mod снова выполните команду go mod init captcha :
Запустите команду : go mod tidy , чтобы загрузить пакеты, необходимые для проекта:
Выше сказано: загрузка пакета «go-micro.dev/v4» не удалась, тогда вам нужно запустить команду go get go-micro.dev/v4, конкретная ссылка : [golang microservices] 7. Введение в go-micro framework, строительные леса Go-micro, go-micro в сочетании с консулом для создания случая микросервиса,
здесь может показаться , что импорт всегда сообщается красным , решение см .: golang open mod после отчета об импорте красное решение
  1. Запустить обнаружение службы консул

Запустите команду в cmd: consul agent -dev, конкретная ссылка: [golang microservice] 5. Введение в обнаружение службы микросервиса, установка и использование консула, кластера Consul
  1. Создать экземпляр консула в main.go

Конкретная ссылка: [микросервис golang] 7. Введение в структуру Go-micro, строительные леса go-micro, go-micro в сочетании с консулом для создания случая микросервиса , код выглядит следующим образом:

package main

import (
    "captcha/handler"
    pb "captcha/proto/captcha"
    "go-micro.dev/v4"
    "go-micro.dev/v4/logger"
    "github.com/go-micro/plugins/v4/registry/consul"
)

var (
    service = "captcha"
    version = "latest"
)

func main() {
    //集成consul
    consulReg := consul.NewRegistry()
    // Create service
    srv := micro.NewService(
        micro.Address("127.0.0.1:8081"),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的client
        micro.Name(service),
        micro.Version(version),
        //注册consul
        micro.Registry(consulReg),
    )
    srv.Init(
        micro.Name(service),
        micro.Version(version),
    )

    // Register handler
    if err := pb.RegisterCaptchaHandler(srv.Server(), new(handler.Captcha)); err != nil {
        logger.Fatal(err)
    }
    // Run service
    if err := srv.Run(); err != nil {
        logger.Fatal(err)
    }
}
  1. handler/captcha.go инкапсулирует и реализует метод rpc в proto/captcha.proto

Обратитесь к сервисному методу Captcha в proto/captcha.proto для реализации или обратитесь к методу, сгенерированному в сгенерированном .pb.micro.go для реализации

(1).pb.micro.go справочный код:



// Client API for Captcha service
type CaptchaService interface {
    // 获取验证码: MakeCaptchaRequest请求, MakeCaptchaRequest返回
    MakeCaptcha(ctx context.Context, in *MakeCaptchaRequest, opts ...client.CallOption) (*MakeCaptchaResponse, error)
    // 校验验证码: VerifyCaptchaRequest请求, VerifyCaptchaResponse返回
    VerifyCaptcha(ctx context.Context, in *VerifyCaptchaRequest, opts ...client.CallOption) (*VerifyCaptchaResponse, error)
}

(2).handler/captcha.go код:

Скопируйте код captcha.go из раздела 1. Знакомство с функцией проверочного кода Captcha в handler/captcha.go, а затем измените его.

1) Сначала импортируйте " github.com/mojocn/base64Captcha"

Поместите « github.com/mojocn/base64Captcha» в импорт, а затем импортируйте его через go mod tidy или перейдите на
github.com/mojocn/base64Captcha .

2).Настроить RedisStore

Скопируйте в него var store base64Captcha.Store = RedisStore{}

//创建store,保存验证码的位置,默认为mem(内存中)单机部署,如果要布置多台服务器,则可以设置保存在redis中
//var store = base64Captcha.DefaultMemStore

//配置RedisStore, 保存验证码的位置为redis, RedisStore实现base64Captcha.Store接口
var store base64Captcha.Store = RedisStore{}
Здесь используется метод хранения redis , поэтому redis нужно инициализировать , и нужен код для реализации метода установки капчи , поэтому файлы models/redisCore.go и models/redisStore.go нужно создавать под капчей . подробности см.: [golang gin framework] 12.Gin mall project-base64Captcha генерирует графический код проверки и настраивает Captcha в распределенной архитектуре.
Код для инициализации Redis
Код redisCore.go выглядит следующим образом:

package models

//redis官网: github.com/go-redis
//下载go-redis: go get github.com/redis/go-redis/v9
//连接redis数据库核心代码

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
    "gopkg.in/ini.v1"
    "os"
)

//全局使用,就需要把定义成公有的
var ctxRedis = context.Background()

var (
    RedisDb *redis.Client
)

//是否开启redis
var redisEnable bool

//自动初始化数据库
func init() {
    //加载配置文件
    config, iniErr := ini.Load("./conf/app.ini")
    if iniErr != nil {
        fmt.Printf("Fail to read file: %v", iniErr)
        os.Exit(1)
    }
    //获取redis配置
    ip := config.Section("redis").Key("ip").String()
    port := config.Section("redis").Key("port").String()
    redisEnable, _ = config.Section("redis").Key("redisEnable").Bool()

    //判断是否开启redis
    if redisEnable {
        RedisDb = redis.NewClient(&redis.Options{
            Addr:     ip + ":" + port,
            Password: "", // no password set
            DB:       0,  // use default DB
        })

        //连接redis
        _, err := RedisDb.Ping(ctxRedis).Result()
        //判断连接是否成功
        if err != nil {
            println(err)
        }
    }
}
Код метода установки капчи
Код redisStore.go выглядит следующим образом:

package models

/**
使用redis需实现Store中的三个方法
type Store interface {
    // Set sets the digits for the captcha id.
    Set(id string, value string)

    // Get returns stored digits for the captcha id. Clear indicates
    // whether the captcha must be deleted from the store.
    Get(id string, clear bool) string

    //Verify captcha's answer directly
    Verify(id, answer string, clear bool) bool
}
 */

import (
    "context"
    "fmt"
    "time"
)

var ctx = context.Background()

const CAPTCHA = "captcha:"

type RedisStore struct {
}

//实现设置 captcha 的方法
func (r RedisStore) Set(id string, value string) error {
    key := CAPTCHA + id
    err := RedisDb.Set(ctx, key, value, time.Minute*2).Err()
    return err
}

//实现获取 captcha 的方法
func (r RedisStore) Get(id string, clear bool) string {
    key := CAPTCHA + id
    //获取 captcha
    val, err := RedisDb.Get(ctx, key).Result()
    if err != nil {
        fmt.Println(err)
        return ""
    }
    //如果clear == true, 则删除
    if clear {
        err := RedisDb.Del(ctx, key).Err()
        if err != nil {
            fmt.Println(err)
            return ""
        }
    }
    return val
}

//实现验证 captcha 的方法
func (r RedisStore) Verify(id, answer string, clear bool) bool {
    v := RedisStore{}.Get(id, clear)
    return v == answer
}
Ini.Load используется здесь для загрузки
Ссылка: [golang gin framework] 9. Используйте транзакции и go-ini для загрузки файлов конфигурации .ini в Gin GORM.

3) Реализовать код бизнес-логики метода кода проверки.

Скопируйте код метода captcha.go, чтобы получить проверочный код в 1. Введение функции проверочного кода Captcha в MakeCaptcha в handler/captcha.go , а затем измените его. Код выглядит следующим образом.

//获取验证码的方法
func (e *Captcha) MakeCaptcha(ctx context.Context, req *pb.MakeCaptchaRequest, rsp *pb.MakeCaptchaResponse) error {
    //实现业务逻辑代码
    //定义一个driver
    var driver base64Captcha.Driver
    //创建一个字符串类型的验证码驱动DriverString, DriverChinese :中文驱动
    driverString := base64Captcha.DriverString{
        Height:          int(req.Height),                                     //高度
        Width:           int(req.Width),                                    //宽度
        NoiseCount:      0,                                      //干扰数
        ShowLineOptions: 2 | 4,                                  //展示个数
        Length:          int(req.Length),                                      //长度
        Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
        BgColor: &color.RGBA{ // 背景颜色
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"}, // 字体
    }
    driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    //把生成的验证码id,base64编码赋值给返回的rsp参数
    rsp.Id = id
    rsp.B64S = b64s

    return err
}

4) Реализовать код бизнес-логики метода проверки кода проверки.

Скопируйте код метода captcha.go, проверив код подтверждения в 1. Знакомство с функцией кода подтверждения Captcha, в MakeCaptcha обработчика/captcha.go , а затем измените его.Код выглядит следующим образом:

//校验验证码的方法
func (e *Captcha) VerifyCaptcha(ctx context.Context, req *pb.VerifyCaptchaRequest, rsp *pb.VerifyCaptchaResponse) error {
    // 参数说明: id 验证码id, verifyValue 验证码的值, true: 验证成功后是否删除原来的验证码
    if store.Verify(req.Id, req.VerifyValue, true) {
        rsp.VerifyResult = true  //校验成功
    } else {
        rsp.VerifyResult = false  //校验失败
    }
    return nil
}

4) Полный код выглядит следующим образом


package handler

import (
    "captcha/models"
    pb "captcha/proto/captcha"
    "context"
    "github.com/mojocn/base64Captcha"
    "image/color"
)

//创建store,保存验证码的位置,默认为mem(内存中)单机部署,如果要布置多台服务器,则可以设置保存在redis中
//var store = base64Captcha.DefaultMemStore

//配置RedisStore, 保存验证码的位置为redis, RedisStore实现base64Captcha.Store接口
var store base64Captcha.Store = models.RedisStore{}

type Captcha struct{}

//获取验证码的方法
func (e *Captcha) MakeCaptcha(ctx context.Context, req *pb.MakeCaptchaRequest, rsp *pb.MakeCaptchaResponse) error {
    //实现业务逻辑代码
    //定义一个driver
    var driver base64Captcha.Driver
    //创建一个字符串类型的验证码驱动DriverString, DriverChinese :中文驱动
    driverString := base64Captcha.DriverString{
        Height:          int(req.Height),                                     //高度
        Width:           int(req.Width),                                    //宽度
        NoiseCount:      0,                                      //干扰数
        ShowLineOptions: 2 | 4,                                  //展示个数
        Length:          int(req.Length),                                      //长度
        Source:          "1234567890qwertyuioplkjhgfdsazxcvbnm", //验证码随机字符串来源
        BgColor: &color.RGBA{ // 背景颜色
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"}, // 字体
    }
    driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    //把生成的验证码id,base64编码赋值给返回的rsp参数
    rsp.Id = id
    rsp.B64S = b64s

    return err
}

//校验验证码的方法
func (e *Captcha) VerifyCaptcha(ctx context.Context, req *pb.VerifyCaptchaRequest, rsp *pb.VerifyCaptchaResponse) error {
    // 参数说明: id 验证码id, verifyValue 验证码的值, true: 验证成功后是否删除原来的验证码
    if store.Verify(req.Id, req.VerifyValue, true) {
        rsp.VerifyResult = true  //校验成功
    } else {
        rsp.VerifyResult = false  //校验失败
    }
    return nil
}
  1. Регистрационный проверочный код Microservice Server для обнаружения служб (consul)

Запустите go run main.go в каталоге с капчей, а затем проверьте в пользовательском интерфейсе консула, прошла ли регистрация успешно.
Регистрация прошла успешно

3. Создайте клиент микросервиса с проверочным кодом капчи.

  1. Сгенерировать клиентский код в единой архитектуре предыдущего проекта торгового центра

Код интерфейса для вызова кода проверки капчи в ТЦ с одной архитектурой осуществляется через интерфейс http://127.0.0.1:8080/admin/captcha Конкретный код выглядит следующим образом:

adminRouters.go


//验证码
adminRouters.GET("/captcha", admin.LoginController{}.Captcha)

LoginController.go


//获取验证码,验证验证码func(con LoginController) Captcha(c *gin.Context) {
	id, b64s, err := models.MakeCaptcha(50, 100 ,1)
	if err != nil {
		fmt.Println(err)
	}
	c.JSON(http.StatusOK, gin.H{
		"captchaId":    id,
		"captchaImage": b64s,
	})
}
Вышеупомянутое вызывает метод MakeCaptcha() в captcha.go в моделях для получения проверочного кода. Этот captcha.go также является кодом captcha.go в 1. Введение функции проверочного кода Captcha . Это исходный подход с единой архитектурой . Доступ как следует:
Теперь он будет передан микросервису кода проверки капчи для обработки.
  1. Сначала скопируйте папку server/captcha/proto в проект

  1. Инкапсулировать метод клиента микросервиса с проверочным кодом captcha.go

Для проверочного кода из предыдущих глав и передняя часть , и фоновая часть должны выполнять логическую обработку проверочного кода , а вызывающий метод — это метод в models/captcha.go, поэтому при обработке клиента микросервиса он также изменяется здесь.

(1) Настроить обнаружение службы консул

Для начала создадим initCaptchaConsul.go под моделями и настроим обнаружение консул-сервиса для вызова, код такой:
package models

//微服务客户端配置: 初始化consul配置,当一个项目中多个微服务时,就很方便了
//建议:一个微服务对应一个客户端,这样好管理

import (
    "github.com/go-micro/plugins/v4/registry/consul"
    "go-micro.dev/v4/client"
    "go-micro.dev/v4/registry"
)

//CaptchaClient: 全局变量 在外部的包中可以调用
var CaptchaClient client.Client

//init 方法: 当程序运行时就会自动执行
func init() {
    consulRegistry := consul.NewRegistry(
        //指定微服务的ip:  选择注册服务器地址,默认为本机,也可以选择consul集群中的client,建议一个微服务对应一个consul集群的client
        registry.Addrs("127.0.0.1:8500"),
    )
    // Create service
    srv := micro.NewService(
        micro.Registry(consulRegistry),
    )
    srv.Init()

    CaptchaClient = srv.Client()
}
Здесь, возможно, не введено, выполните команду: go mod tidy импортирует соответствующий пакет

(2) Улучшите MakeCaptcha в models/captcha.go, чтобы получить метод кода подтверждения.

В этом методе реализуем логическую функцию вызова и получения микросервиса проверочного кода.
//调用获取验证码微服务
func MakeCaptcha(height int, width int, length int) (string, string, error) {

    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的MakeCaptcha方法
    rsp, err := captchaClient.MakeCaptcha(context.Background(), &pbCaptcha.MakeCaptchaRequest{
        Height:     int32(height),  //验证码高度
        Width:     int32(width),  //验证码宽度
        Length:     int32(length),  //验证码长度
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.Id, rsp.B64S, err
}

(3) Улучшить метод проверки кода VerifyCaptcha в models/captcha.go.

В данном методе реализована логическая функция микросервиса вызова кода проверки верификации
//调用校验验证码微服务
func VerifyCaptcha(id string, VerifyValue string) bool {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的VerifyCaptcha方法
    rsp, err := captchaClient.VerifyCaptcha(context.Background(), &pbCaptcha.VerifyCaptchaRequest{
        Id:     id,  //验证码Id
        VerifyValue:     VerifyValue,  //验证码
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.VerifyResult
}

(4) Полный код выглядит следующим образом

package models

//验证码属性: https://captcha.mojotv.cn/
import (
    "context"
    "github.com/prometheus/common/log"
    pbCaptcha "goshop/proto/captcha"
)

//调用获取验证码微服务
func MakeCaptcha(height int, width int, length int) (string, string, error) {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的MakeCaptcha方法
    rsp, err := captchaClient.MakeCaptcha(context.Background(), &pbCaptcha.MakeCaptchaRequest{
        Height:     int32(height),  //验证码高度
        Width:     int32(width),  //验证码宽度
        Length:     int32(length),  //验证码长度
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.Id, rsp.B64S, err
}

//调用校验验证码微服务
func VerifyCaptcha(id string, VerifyValue string) bool {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的VerifyCaptcha方法
    rsp, err := captchaClient.VerifyCaptcha(context.Background(), &pbCaptcha.VerifyCaptchaRequest{
        Id:     id,  //验证码Id
        VerifyValue:     VerifyValue,  //验证码
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    return rsp.VerifyResult
}
  1. Функция микросервиса Verification captcha кода подтверждения

(1) Сначала запустите сервер

см. предыдущий код

(2) Запустите клиент

Запустите в корневом каталоге проекта : запустите main.go, чтобы запустить проект.

(3). Посетите http://127.0.0.1:8080/admin/captcha.

Посетите http://127.0.0.1:8080/admin/captcha , чтобы увидеть, отображаются ли данные, связанные с проверочным кодом.
Отображается, указывая на то, что операция микросервиса с проверочным кодом вызывается

(4) Убедитесь, что операция микросервиса с проверочным кодом выполнена успешно.

Посетите фоновую страницу входа, введите имя пользователя, пароль, проверочный код и посмотрите, успешно ли это
Что ж, работа клиента микросервиса кода проверки капчи завершена. Здесь выше приведена функция вызова микросервиса кода проверки капчи на веб-странице. Ниже приводится объяснение Go Web Restfull APi, вызывающего микросервис кода проверки капчи.

4. Go Web Restfull APi вызывает микросервис с проверочным кодом Captcha

Go Web Restfull APi вызывает микросервис кода подтверждения Captcha в основном для предоставления интерфейсов для мобильных приложений, апплетов WeChat и т. д. Архитектура выглядит следующим образом.
  1. Создайте проект API Gin и настройте маршрутизаторы.

Здесь непосредственно возьмем приведенный выше проект как случай, создадим файл маршрутизации apiRouters.go под маршрутизаторами
  1. Создайте интерфейс, связанный с проверочным кодом, код выглядит следующим образом

Напишите и получите проверочный код в файле controllers/api/ CaptchaController.go и проверьте соответствующую логику проверочного кода.Код выглядит следующим образом:
package api

import (
    "context"
    "github.com/gin-gonic/gin"
    "github.com/prometheus/common/log"
    "goshop/models"
    pbCaptcha "goshop/proto/captcha"
    "net/http"
)

type CatpchaController struct {
}

//获取验证码的接口(调用验证码微服务操作)
func (con CatpchaController) MakeCaptcha(c *gin.Context) {
    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", models.CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的MakeCaptcha方法
    rsp, err := captchaClient.MakeCaptcha(context.Background(), &pbCaptcha.MakeCaptchaRequest{
        Height:     100,  //验证码高度
        Width:     200,  //验证码宽度
        Length:     4,  //验证码长度
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    c.JSON(http.StatusOK, gin.H{
        "captchaId": rsp.Id,
        "B64s": rsp.B64S,
    })
}

//校验验证码接口
func (con CatpchaController) VerifyCaptcha(c *gin.Context) {
    //获取请求参数
    verifyId := c.PostForm("verifyId")
    verifyValue := c.PostForm("verifyValue")

    // Create client: 这里的服务名称需要和服务端注册的名称一致
    captchaClient := pbCaptcha.NewCaptchaService("captcha", models.CaptchaClient)
    // Call service: 创建连接captcha微服务的连接,并传递参数,
    //该方法最终是请求server端handler中的captcha.go中的VerifyCaptcha方法
    rsp, err := captchaClient.VerifyCaptcha(context.Background(), &pbCaptcha.VerifyCaptchaRequest{
        Id:     verifyId,  //验证码Id
        VerifyValue:     verifyValue,  //验证码
    })
    //判断是否获取成功
    if err != nil {
        log.Fatal(err)
    }
    //记录log
    log.Info(rsp)
    //返回
    if rsp.VerifyResult == true {  // 说明验证通过
        c.JSON(http.StatusOK, gin.H{
            "message": "验证验证码成功",
            "success": true,
        })
    } else {
        c.JSON(http.StatusOK, gin.H{
            "message": "验证验证码失败",
            "success": false,
        })
    }
}
  1. Проверьте, успешно ли выполнен запрос API.

Запросите http://127.0.0.1:8080/api/MakeCaptcha, чтобы узнать, возвращается ли соответствующий запрос json с проверочным кодом.
Как видно из рисунка выше, если возвращаются данные, соответствующие проверочному коду, поместите данные в B64s в <img src ="B64s" />, и все будет в порядке.Отображаемая картина выглядит следующим образом:

Затем подтвердите код подтверждения, обычно через проверку почтальона.

Что ж, Go Web Restfull APi вызывает микросервис проверочного кода Captcha для получения проверочного кода, и операция проверки API-интерфейса проверочного кода завершена.

[Предыдущий раздел] [golang gin framework] 39. Проект Gin Mall — Архитектура микросервисов в практике микросервисов

[Следующий раздел] [инфраструктура golang gin] 41. Проект Gin mall - фоновый микросервис Rbac после фактического боя микросервиса (вход пользователя, отдельное извлечение конфигурации базы данных Gorm, отдельное извлечение конфигурации Consul)

Supongo que te gusta

Origin blog.csdn.net/zhoupenghui168/article/details/131742761
Recomendado
Clasificación