package handler import ( "bytes" "encoding/json" "io" "log" "net/http" "strconv" "kfz-goods-pricing/internal/service" ) // GoodsHandler 商品处理器 type GoodsHandler struct { goodsService *service.GoodsService } // NewGoodsHandler 创建商品处理器实例 func NewGoodsHandler(goodsService *service.GoodsService) *GoodsHandler { return &GoodsHandler{ goodsService: goodsService, } } // QueryGoods 查询商品接口 func (h *GoodsHandler) QueryGoods(w http.ResponseWriter, r *http.Request) { // 只支持POST请求 if r.Method != http.MethodPost { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return } // 读取原始body用于调试 bodyBytes, _ := io.ReadAll(r.Body) bodyStr := string(bodyBytes) log.Printf("收到原始请求 Body: [%s]", bodyStr) log.Printf("Content-Type: [%s]", r.Header.Get("Content-Type")) // 重新创建body供ParseForm使用 r.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // 解析参数 - ParseMultipartForm 同时支持 form-data 和 x-www-form-urlencoded if err := r.ParseMultipartForm(32 << 20); err != nil { // 尝试纯表单解析 if err := r.ParseForm(); err != nil { log.Printf("ParseForm 失败: %v", err) http.Error(w, "Invalid request form", http.StatusBadRequest) return } } // 调试日志 log.Printf("解析结果 - isbn: [%s], out_id: [%s], quality: [%s], query_index: [%s], user_id: [%s],placeholder_down_price:[%s], min_shipping_fee:[%s],min_price[%s] ", r.FormValue("isbn"), r.FormValue("out_id"), r.FormValue("quality"), r.FormValue("query_index"), r.FormValue("user_id"), r.FormValue("placeholder_down_price"), r.FormValue("min_shipping_fee"), r.FormValue("min_price")) var req service.QueryRequest req.ISBN = r.FormValue("isbn") req.OutID = r.FormValue("out_id") req.Quality = r.FormValue("quality") req.QueryIndex, _ = strconv.Atoi(r.FormValue("query_index")) req.UserID = r.FormValue("user_id") req.PlaceholderDownPrice, _ = strconv.ParseFloat(r.FormValue("placeholder_down_price"), 64) req.MinShippingFee, _ = strconv.ParseFloat(r.FormValue("min_shipping_fee"), 64) req.MinPrice, _ = strconv.ParseFloat(r.FormValue("min_price"), 64) // 参数校验 if req.ISBN == "" { http.Error(w, "isbn is required", http.StatusBadRequest) return } // 调用服务层 resp := h.goodsService.QueryGoods(&req) // 返回响应 w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(resp) }