Maison >développement back-end >Golang >Utilisez le framework Gin pour implémenter les fonctions de génération et de numérisation de codes QR

Utilisez le framework Gin pour implémenter les fonctions de génération et de numérisation de codes QR

王林
王林original
2023-06-23 08:18:091824parcourir

Dans la société moderne, les codes QR sont devenus une méthode courante de transmission d'informations. Il peut fournir des informations rapidement et faciliter la vie des gens. Pour les développeurs, la manière de générer et de scanner des codes QR de manière pratique et rapide est une question à prendre en compte. Dans cet article, nous présenterons comment utiliser le framework Gin pour réaliser les fonctions de génération et de numérisation de codes QR.

  1. Installer le framework Gin et les bibliothèques associées

Tout d'abord, nous devons installer le framework Gin et les bibliothèques associées. Exécutez la commande suivante pour terminer l'installation :

go get -u github.com/gin-gonic/gin
go get -u github.com/skip2/go-qrcode
go get -u github.com/fogleman/gg

Parmi eux, gin est le framework Gin, go-qrcode est la bibliothèque pour générer des codes QR et gg est la bibliothèque pour générer des images.

  1. Générer le code QR

Ensuite, nous devons écrire le code pour générer le code QR. Nous pouvons définir une fonction qui génère un code QR. Le code est le suivant :

func generateQRCode(c *gin.Context) {
    // 获取传递的参数
    content := c.Query("content")
    size := c.DefaultQuery("size", "256")

    // 生成二维码图片
    qr, err := qrcode.New(content, qrcode.Medium)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    qr.DisableBorder = true
    img := qr.Image(int(size))

    // 将图片存储为PNG格式
    buffer := new(bytes.Buffer)
    err = png.Encode(buffer, img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将图片作为响应输出给客户端
    c.Data(http.StatusOK, "image/png", buffer.Bytes())
}

Dans le code ci-dessus, nous lisons le paramètre content passé comme le contenu du code QR. , on peut également passer size est utilisé pour définir la taille du code QR. La valeur par défaut est 256. Nous utilisons la fonction qrcode.New dans la bibliothèque go-qrcode pour générer des images de code QR. Nous pouvons également supprimer la bordure de l'image via l'attribut DisableBorder. Enfin, nous utilisons la fonction png.Encode dans la bibliothèque gg pour stocker l'image au format PNG, et utilisons la méthode c.Data de le framework Gin Affiche l'image en réponse au client. content参数作为二维码的内容,同时也可以通过size参数来设置二维码的大小,默认值为256。我们使用go-qrcode库中的qrcode.New函数来生成二维码图片。我们还可以通过DisableBorder属性来去掉图片边框。最后,我们使用gg库中的png.Encode函数将图片以PNG格式进行存储,并通过Gin框架的c.Data方法将图片作为响应输出给客户端。

  1. 扫描二维码

在生成完二维码之后,我们需要编写扫描二维码的代码。我们可以在路由中添加一个扫描二维码的路由,其代码如下:

func scanQRCode(c *gin.Context) {
    // 读取上传的图片文件
    file, err := c.FormFile("file")
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 打开上传的文件
    f, err := file.Open()
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    defer f.Close()

    // 读取文件内容并解码
    img, err := png.Decode(f)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    content, err := qrcode.Decode(img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将解码后的内容作为响应输出给客户端
    c.JSON(http.StatusOK, gin.H{
        "content": content,
    })
}

在上述代码中,我们使用Gin框架的FormFile函数读取上传的图片文件。我们再通过png.Decode函数对文件内容进行解码,使用go-qrcode库中的qrcode.Decode函数将解码后的内容作为响应输出给客户端。

  1. 完整代码

在上述步骤完成之后,我们进行代码的完整编写,如下:

package main

import (
    "bytes"
    "net/http"
    "strconv"

    "github.com/gin-gonic/gin"
    "github.com/fogleman/gg"
    "github.com/skip2/go-qrcode"
)

func main() {
    r := gin.Default()

    // 生成二维码
    r.GET("/qrcode", generateQRCode)

    // 扫描二维码
    r.POST("/qrcode", scanQRCode)

    r.Run()
}

func generateQRCode(c *gin.Context) {
    // 获取传递的参数
    content := c.Query("content")
    sizeStr := c.DefaultQuery("size", "256")

    // 将size参数转换为int类型
    size, err := strconv.Atoi(sizeStr)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 生成二维码图片
    qr, err := qrcode.New(content, qrcode.Medium)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    qr.DisableBorder = true
    img := qr.Image(size)

    // 将图片存储为PNG格式
    buffer := new(bytes.Buffer)
    err = png.Encode(buffer, img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将图片作为响应输出给客户端
    c.Data(http.StatusOK, "image/png", buffer.Bytes())
}

func scanQRCode(c *gin.Context) {
    // 读取上传的图片文件
    file, err := c.FormFile("file")
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 打开上传的文件
    f, err := file.Open()
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    defer f.Close()

    // 读取文件内容并解码
    img, err := png.Decode(f)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    content, err := qrcode.Decode(img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将解码后的内容作为响应输出给客户端
    c.JSON(http.StatusOK, gin.H{
        "content": content,
    })
}

在以上代码中,我们使用了Gin框架来定义两个处理函数generateQRCodescanQRCode。在generateQRCode函数中,我们使用go-qrcode库生成了二维码,并使用gg库生成了PNG格式的图片。而在scanQRCode函数中,我们解析上传的二维码图片,并读取二维码内容,最后将内容通过Gin框架的c.JSON方法作为响应输出给客户端。我们在主函数中使用Gin框架的路由函数来定义了qrcode

    Scannez le code QR
    1. Après avoir généré le code QR, nous devons écrire le code pour scanner le code QR. Nous pouvons ajouter un itinéraire pour scanner les codes QR dans l'itinéraire, le code est le suivant :
    go run main.go

    Dans le code ci-dessus, nous utilisons la fonction FormFile du framework Gin pour lire le fichier image téléchargé. Nous décodons ensuite le contenu du fichier via la fonction png.Decode, et utilisons la fonction qrcode.Decode dans la bibliothèque go-qrcode pour décoder le contenu du fichier. contenu décodé. Sortie au client en réponse.

      Code complet

      Une fois les étapes ci-dessus terminées, nous écrivons le code complet, comme suit :

      curl -X POST -F "file=@qrcode.png" http://localhost:8080/qrcode

      Dans le code ci-dessus, nous utilisons le framework Gin pour définir deux fonctions de traitementgénérerQRCode et scanQRCode. Dans la fonction generateQRCode, nous utilisons la bibliothèque go-qrcode pour générer un code QR, et utilisons la bibliothèque gg pour générer une image au format PNG . Dans la fonction scanQRCode, nous analysons l'image du code QR téléchargée, lisons le contenu du code QR et transmettons enfin le contenu via la méthode c.JSON du framework Gin en guise de réponse. au client. Nous utilisons la fonction de routage du framework Gin dans la fonction principale pour définir les requêtes GET et POST sous le chemin qrcode correspondant respectivement aux fonctions de génération de codes QR et de numérisation de codes QR. 🎜🎜🎜Effet d'utilisation🎜🎜🎜Après avoir terminé le code ci-dessus, nous pouvons démarrer le service via la commande suivante : 🎜rrreee🎜Puis visitez http://localhost:8080/qrcode?content=HelloWorld dans le navigateur pour générer un code binaire Code QR. Si nous voulons scanner le code QR que nous venons de générer, nous devons d'abord enregistrer le code QR en tant que fichier image au format PNG, puis utiliser des outils tels que curl ou Postman pour télécharger le fichier image, par exemple : 🎜rrreee🎜Dans ce De cette manière, nous pouvons renvoyer Récupérer le contenu contenu dans le code QR dans la réponse. 🎜🎜À ce stade, nous avons implémenté avec succès les fonctions de génération et de numérisation de codes QR à l'aide du framework Gin, ce qui facilite notre travail de développement. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn