使用GO构建信用卡验证器
#初学者 #go #http #backenddevelopment

简介ð©©©

在本教程中,我们将使用GO和Luhn算法构建信用卡验证器。

Luhn算法是用于验证信用卡编号的数学公式。我们将编写一个实现它并使用它来验证卡号的函数。

为了实现这一目标,我们将在GO中构建一个非常简单的服务器,该服务器会处理发布请求,请与卡号提取JSON有效载荷,并在数字有效是否有效时返回JSON响应。

â!â€您需要什么

  • 您选择的IDE

  • Postman(或者您可以使用卷曲)

让我们开始编码ð

项目设置

  1. 为您的项目创建一个新目录,例如credit-card-validation

  2. 打开一个终端并导航到项目目录:cd path/to/credit-card-validation

  3. 在您的项目目录中,创建一个GO文件,我们将实现Luhn算法:touch luhn_algorithm.go

实现luhn算法

要实现该算法,我已将从Internet获取的公式规则转换为代码。因此,这里没有太多要添加的东西,但是我将使用内联注释的函数发布代码以提供上下文。

package main

func luhnAlgorithm(cardNumber string) bool {
    // this function implements the luhn algorithm
    // it takes as argument a cardnumber of type string
    // and it returns a boolean (true or false) if the
    // card number is valid or not

    // initialise a variable to keep track of the total sum of digits
    total := 0
    // Initialize a flag to track whether the current digit is the second digit from the right.
    isSecondDigit := false

    // iterate through the card number digits in reverse order
    for i := len(cardNumber) - 1; i >= 0; i-- {
        // conver the digit character to an integer
        digit := int(cardNumber[i] - '0')

        if isSecondDigit {
            // double the digit for each second digit from the right
            digit *= 2
            if digit > 9 {
                // If doubling the digit results in a two-digit number,
                //subtract 9 to get the sum of digits.
                digit -= 9
            }
        }

        // Add the current digit to the total sum
        total += digit

        //Toggle the flag for the next iteration.
        isSecondDigit = !isSecondDigit
    }

    // return whether the total sum is divisible by 10
    // making it a valid luhn number
    return total%10 == 0
}

构建服务器

我们现在将设置一个可以在本地运行的简单服务器。创建一个新的GO文件:touch main.go

我们只要编写一条路线,对于额外的爆发,我们将作为命令行参数传递,而不是对其进行硬编码。

func main() {
    args := os.Args
    port := args[1]

    // Register the creditCardValidator function to handle requests at the root ("/") path.
    http.HandleFunc("/", creditCardValidator)
    fmt.Println("Listening on port:", port) 
    // Start an HTTP server listening on the specified port.
    err := http.ListenAndServe(":"+port, nil)
    if err != nil {
        fmt.Println("Error:", err) // Print an error message if the server fails to start.
    }
}

在代码中,已放置占位符函数 CreditCardValidator 处理到达路线的请求“/” - 我们现在将在同一文件中实现此功能。

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)
type Response struct {
    Valid bool `json:"valid"`
}

// creditCardValidator handles the credit card validation logic and JSON response.
func creditCardValidator(writer http.ResponseWriter, request *http.Request) {
    // Check if the request method is POST.
    if request.Method != http.MethodPost {
        // if not, throw an error
        http.Error(writer, "Invalid request method", http.StatusMethodNotAllowed)
        return
    }
    // Create a struct to hold the incoming JSON payload.
    var cardNumber struct {
        Number string `json:"number"` // Number field holds the credit card number.
    }

    // Decode the JSON payload from the request body into the cardNumber struct.
    err := json.NewDecoder(request.Body).Decode(&cardNumber)
    if err != nil {
        http.Error(writer, "Invalid JSON payload", http.StatusBadRequest)
        return
    }
    // Validate the credit card number using the Luhn algorithm.
    isValid := luhnAlgorithm(cardNumber.Number)
    // Create a response struct with the validation result.
    response := Response{Valid: isValid}

    // Marshal the response struct into JSON format.
    jsonResponse, err := json.Marshal(response)
    if err != nil {
        http.Error(writer, "Error creating response", http.StatusInternalServerError)
        return
    }

    // Set the content type header to indicate JSON response.
    writer.Header().Set("Content-Type", "application/json")

    // Write the JSON response back to the client.
    writer.Write(jsonResponse)
}

深度潜水ðÖ

&符号

请注意,当我们解码JSON时,我们在变量cardNumber.

之前使用符号&be

ðâ
在GO中,&符号用作“地址”运算符。它用于获得变量的内存地址。当您在变量前使用&时,它将返回该变量内存位置的指针。

在我们的代码段的上下文中,cardNumber是一个结构变量,可容纳从JSON有效载荷中提取的信用卡号。 json.NewDecoderDecode函数从输入源读取JSON数据(在这种情况下为Request body r.Body),并试图用相应的JSON值填充提供的struck的字段(在这种情况下为cardNumber)。

&cardNumber部分将指向cardNumber struct的指针传递给Decode函数。这允许Decode函数使用变量的内存地址直接修改cardNumber结构的字段,而不是制作结构的副本。这是更有效的记忆,您可以使用实际的结构实例而不是副本!

到“元帅”

在GO中,“元帅”是指将GO数据结构(例如结构,地图或数组)转换为其JSON表示的过程。换句话说,这是将GO数据编码为JSON格式的过程,该格式可以通过网络发送或存储在文件中。这就是我们使用json.marshal(response)时正在做的。

初始化GO模块

  1. 初始化GO模块以管理依赖项:

    go mod init credit-card-validation
    

最后,运行项目

  1. 使用GO编译器运行项目。我正在使用端口8080,但是您可以使用任何您喜欢的端口。

    go run main.go luhn_algorithm.go 8080
    

要测试它是否有效,请使用Postman或Curl将邮政请求发送到路由“/”的服务器,并将信用卡号添加到请求正文中:

  1. 设置标题:content-type:application/json

  2. http://localhost:8080/

  3. 发送职位请求
  4. 将请求主体设置为{ "number": "4003600000000014" }

如果一切顺利,您应该收到此响应{"valid": true}

结论ð

祝贺建立信用卡验证器!

让我知道,我还应该实施什么?您喜欢这篇博客文章吗?在您的想法中发表评论,并下次见到ð

ð
您可以在我的github上找到完整的代码库。我的个人资料上的链接