Heim >Backend-Entwicklung >Golang >Verwenden Sie das Gin-Framework, um QR-Code-Generierungs- und Scanfunktionen zu implementieren

Verwenden Sie das Gin-Framework, um QR-Code-Generierungs- und Scanfunktionen zu implementieren

王林
王林Original
2023-06-23 08:18:091810Durchsuche

In der modernen Gesellschaft sind QR-Codes zu einer gängigen Methode zur Informationsübertragung geworden. Es kann Informationen schnell liefern und das Leben der Menschen erleichtern. Für Entwickler ist die Frage, wie sie QR-Codes bequem und schnell generieren und scannen können, eine Frage, die berücksichtigt werden muss. In diesem Artikel stellen wir vor, wie Sie mit dem Gin-Framework die Generierungs- und Scanfunktionen von QR-Codes realisieren.

  1. Installieren Sie das Gin-Framework und die zugehörigen Bibliotheken.

Zuerst müssen wir das Gin-Framework und die zugehörigen Bibliotheken installieren. Führen Sie den folgenden Befehl aus, um die Installation abzuschließen:

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

Gin ist das Gin-Framework, go-qrcode ist die Bibliothek zum Generieren von QR-Codes und gg ist die Bibliothek zum Generieren von Bildern.

  1. QR-Code generieren

Als nächstes müssen wir den Code schreiben, um den QR-Code zu generieren. Wir können eine Funktion definieren, die einen QR-Code generiert:

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())
}

Im obigen Code lesen wir den übergebenen content-Parameter gleichzeitig , wir können auch size wird verwendet, um die Größe des QR-Codes festzulegen. Der Standardwert ist 256. Wir verwenden die Funktion qrcode.New in der Bibliothek go-qrcode, um QR-Code-Bilder zu generieren. Wir können den Bildrand auch über das Attribut DisableBorder entfernen. Schließlich verwenden wir die Funktion png.Encode in der Bibliothek gg, um das Bild im PNG-Format zu speichern, und verwenden die Methode c.Data von Das Gin-Framework gibt das Bild als Antwort an den Client aus. 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

    Scannen Sie den QR-Code
    1. Nachdem wir den QR-Code generiert haben, müssen wir den Code schreiben, um den QR-Code zu scannen. Wir können der Route eine Route zum Scannen von QR-Codes hinzufügen. Der Code lautet wie folgt:
    go run main.go

    Im obigen Code verwenden wir die Funktion FormFile des Gin-Frameworks, um die hochgeladene Bilddatei zu lesen. Anschließend dekodieren wir den Dateiinhalt mit der Funktion png.Decode und verwenden die Funktion qrcode.Decode in der Bibliothek go-qrcode, um ihn zu dekodieren dekodierter Inhalt als Antwort an den Client ausgegeben.

      Kompletter Code

      Nachdem die obigen Schritte abgeschlossen sind, schreiben wir den vollständigen Code wie folgt:

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

      Im obigen Code verwenden wir das Gin-Framework, um zwei Verarbeitungsfunktionen zu definierenQRCode generieren und QRCode scannen. In der Funktion generateQRCode verwenden wir die Bibliothek go-qrcode, um einen QR-Code zu generieren, und die Bibliothek gg, um ein Bild im PNG-Format zu generieren . In der Funktion scanQRCode analysieren wir das hochgeladene QR-Code-Bild, lesen den Inhalt des QR-Codes und leiten den Inhalt schließlich als Antwortausgabe durch die Methode c.JSON des Gin-Frameworks an den Kunden. Wir verwenden die Routing-Funktion des Gin-Frameworks in der Hauptfunktion, um die GET- und POST-Anfragen unter dem Pfad qrcode zu definieren, die den Funktionen zum Generieren von QR-Codes bzw. Scannen von QR-Codes entsprechen. 🎜🎜🎜Nutzungseffekt🎜🎜🎜Nach Abschluss des obigen Codes können wir den Dienst über den folgenden Befehl starten: 🎜rrreee🎜Besuchen Sie dann http://localhost:8080/qrcode?content=HelloWorld im Browser, um einen Binärcode zu generieren QR-Code. Wenn wir den soeben generierten QR-Code scannen möchten, müssen wir den QR-Code zunächst als Bilddatei im PNG-Format speichern und dann Tools wie Curl oder Postman verwenden, um die Bilddatei hochzuladen, zum Beispiel: 🎜rrreee🎜Hier Auf diese Weise können wir den im QR-Code enthaltenen Inhalt in der Antwort abrufen. 🎜🎜Zu diesem Zeitpunkt haben wir die QR-Code-Generierungs- und Scanfunktionen mithilfe des Gin-Frameworks erfolgreich implementiert, was unsere Entwicklungsarbeit erleichtert. 🎜

Das obige ist der detaillierte Inhalt vonVerwenden Sie das Gin-Framework, um QR-Code-Generierungs- und Scanfunktionen zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn