44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
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
|
|
}
|