如何基于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
相关产品推荐
相关产品推荐

