You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Mux实现Golang批量POST接口提交多条produce数据

代码修改方案

你只需要调整接口的JSON解析逻辑,把原来解析单个Produce结构体改为解析Produce切片,再遍历校验所有条目即可,完整修改如下:

1. 优化全局正则(可选,提升性能)

把正则编译逻辑从接口函数里移到全局,避免每次请求都重复编译正则表达式:

// 提前编译好校验规则,全局只需编译一次
var produceCodeRegex = regexp.MustCompile("^[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}$")

2. 修改addProduce接口逻辑

func addProduce(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    // 原来的单个结构体改为切片
    var newProduceItems []Produce
    // 不要忽略解码错误,要做错误处理
    err := json.NewDecoder(r.Body).Decode(&newProduceItems)
    if err != nil {
        http.Error(w, "请求参数格式错误,请检查提交的JSON结构", http.StatusBadRequest)
        return
    }

    // 先校验所有条目,全部合法再写入全局切片,避免部分提交
    var validItems []Produce
    for _, item := range newProduceItems {
        // 校验code和名称
        if !produceCodeRegex.MatchString(item.Code) || len(item.Name) == 0 {
            http.Error(w, fmt.Sprintf("条目[%s]的编码或名称不合法,正确编码示例:A12T-4GH7-QPL9-3N4M", item.Name), http.StatusBadRequest)
            return
        }
        // 处理价格精度
        item.Unit_Price = math.Round(item.Unit_Price*100) / 100
        validItems = append(validItems, item)
    }

    // 批量写入全局切片
    produce = append(produce, validItems...)
    // 返回所有成功添加的条目
    json.NewEncoder(w).Encode(validItems)
}

3. 兼容单条提交的可选方案

如果你需要同时支持原来的单条JSON提交和新的批量数组提交,可以修改解析部分的代码做类型兼容:

func addProduce(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    raw, err := io.ReadAll(r.Body)
    if err != nil {
        http.Error(w, "读取请求体失败", http.StatusBadRequest)
        return
    }
    defer r.Body.Close()

    var newProduceItems []Produce
    // 先尝试解析为数组
    if err := json.Unmarshal(raw, &newProduceItems); err != nil {
        // 解析失败则尝试解析为单个对象
        var singleItem Produce
        if err := json.Unmarshal(raw, &singleItem); err != nil {
            http.Error(w, "请求参数格式错误,请提交单个Produce对象或Produce对象数组", http.StatusBadRequest)
            return
        }
        newProduceItems = append(newProduceItems, singleItem)
    }

    // 后续校验、写入逻辑和上面的批量版本完全一致
    var validItems []Produce
    for _, item := range newProduceItems {
        if !produceCodeRegex.MatchString(item.Code) || len(item.Name) == 0 {
            http.Error(w, fmt.Sprintf("条目[%s]的编码或名称不合法,正确编码示例:A12T-4GH7-QPL9-3N4M", item.Name), http.StatusBadRequest)
            return
        }
        item.Unit_Price = math.Round(item.Unit_Price*100) / 100
        validItems = append(validItems, item)
    }

    produce = append(produce, validItems...)
    json.NewEncoder(w).Encode(validItems)
}

注:兼容单条提交的版本需要提前导入io标准库

修改后路由注册逻辑不需要做任何调整,直接提交数组格式的JSON即可正常批量添加条目。

内容的提问来源于stack exchange,提问作者Brett La Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:27:00