代码之家  ›  专栏  ›  技术社区  ›  Brett Lapierre

通过多路复用器的Golang批处理站

  •  0
  • Brett Lapierre  · 技术社区  · 4 年前

    你好,我是刚来Golang的新手,我想用Mux做一个批量发布。我希望能够发布多个“生产”项目,而不是仅仅一个。

    在这里,我定义了什么是农产品

    // Define the produce structure
    type Produce struct {
        Name string `json:"name"`
        Code string `json:"code"`
        Unit_Price float64 `json:"unit_price"`
    }
    
    // Init produce var as a Produce slice
    var produce []Produce
    

    这是我目前的邮政编码

    func addProduce(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        var newProduceItem Produce
        _ = json.NewDecoder(r.Body).Decode(&newProduceItem)
        re := regexp.MustCompile("^[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}$")
        if re.MatchString(newProduceItem.Code) == true && len(newProduceItem.Name) > 0 {
            newProduceItem.Unit_Price = math.Round(newProduceItem.Unit_Price*100) / 100 //rounds to the nearest cent
            produce = append(produce, newProduceItem)
            json.NewEncoder(w).Encode(newProduceItem)
        } else {
            http.Error(w, fmt.Sprintf("Incorrect produce code sequence or product name. Example code sequence: A12T-4GH7-QPL9-3N4M"), http.StatusBadRequest)
        }
    }
    

    它在main()函数中被调用,如图所示。

    func main() {
        router := mux.NewRouter()
        router.HandleFunc("/produce", addProduce).Methods("POST")
        log.Fatal(http.ListenAndServe(":8000", router))
    }
    

    这里是一个JSON数据的例子,当我在Postman中发布到它时,它正在工作

    {
        "name":"Peach",
        "code": "TTTT-44D4-A12T-1224",
        "unit_price": 5.3334
    }
    

    我希望能够一次发布多个产品项目,例如。。。。

    [
        {
            "name": "Green Pepper",
            "code": "YRT6-72AS-K736-L4AR",
            "unit_price": 0.79
        },
        {
            "name": "Gala Apple",
            "code": "TQ4C-VV6T-75ZX-1RMR",
            "unit_price": 3.59
        },
    ]
    

    非常感谢。

    0 回复  |  直到 4 年前
        1
  •  1
  •   jabbson    4 年前

    显然有很多方法可以做到这一点,这里有一个

    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
        "math"
        "net/http"
        "regexp"
    
        "github.com/gorilla/mux"
    )
    
    type Produce struct {
        Name       string  `json:"name"`
        Code       string  `json:"code"`
        Unit_Price float64 `json:"unit_price"`
    }
    
    type ProduceList []Produce
    
    // global var where all produce is kept,
    // not persistent
    var produce ProduceList
    
    func addProduce(w http.ResponseWriter, r *http.Request) {
    
        // we accept a json and decode it into a slice of structs
        var newProduceItems ProduceList
        err := json.NewDecoder(r.Body).Decode(&newProduceItems)
        if err != nil {
            log.Panic(err)
        }
    
        var tempItems ProduceList
        re := regexp.MustCompile("^[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}$")
    
        // iterate over each element in the posted json and validate
        // when validated, add to the temporary accumulator
        // if not validated, error out and stop
        for idx, produceItem := range newProduceItems {
            if !re.MatchString(produceItem.Code) || len(produceItem.Name) <= 0 {
                errMsg := fmt.Sprintf("Item %d: Incorrect produce code sequence or product name. Example code sequence: A12T-4GH7-QPL9-3N4M", idx)
                http.Error(w, errMsg, http.StatusBadRequest)
                return
            }
    
            produceItem.Unit_Price = math.Round(produceItem.Unit_Price*100) / 100 //rounds to the nearest cent
            tempItems = append(tempItems, produceItem)
        }
    
        // after validation, append new items to the global accumulator and respond back with added items
        produce = append(produce, tempItems...)
        w.Header().Set("Content-Type", "application/json")
        if err = json.NewEncoder(w).Encode(newProduceItems); err != nil {
            log.Panic(err)
        }
    }
    
    func main() {
        router := mux.NewRouter()
        router.HandleFunc("/produce", addProduce).Methods("POST")
        log.Fatal(http.ListenAndServe(":8000", router))
    }