package platform import ( "encoding/json" "errors" "io" "net/http" ) type APIError struct { Status int Code string Message string } func (e *APIError) Error() string { return e.Message } func WriteJSON(w http.ResponseWriter, status int, value any) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(value) } func WriteError(w http.ResponseWriter, err error) { var apiErr *APIError if errors.As(err, &apiErr) { WriteJSON(w, apiErr.Status, map[string]any{"error": map[string]string{"code": apiErr.Code, "message": apiErr.Message}}) return } WriteJSON(w, http.StatusInternalServerError, map[string]any{"error": map[string]string{"code": "internal_error", "message": "服务暂时不可用"}}) } func DecodeJSON(r *http.Request, target any) error { decoder := json.NewDecoder(io.LimitReader(r.Body, (1<<20)+1)) decoder.DisallowUnknownFields() if err := decoder.Decode(target); err != nil { return &APIError{Status: http.StatusBadRequest, Code: "invalid_request", Message: "请求内容格式不正确"} } if err := decoder.Decode(&struct{}{}); err != io.EOF { return &APIError{Status: http.StatusBadRequest, Code: "invalid_request", Message: "请求内容格式不正确"} } return nil }