package okapi import ( "bytes" "encoding/json" "io" "net/http" ) type Request struct { AppKey string ApiName string ApiVersion string Body RequestBody } type RequestBody struct { OaSessionID string `json:"oa-session-id,omitempty"` OaAppMarketID string `json:"oa-app-market-id,omitempty"` OaAppVersion string `json:"oa-app-version,omitempty"` OaDeviceID string `json:"oa-device-id,omitempty"` OaSign string `json:"oa-sign,omitempty"` Timestamp string `json:"timestamp,omitempty"` Params map[string]interface{} `json:"params,omitempty"` } func (req *Request) Decode(r *http.Request) error { reqBody, err := io.ReadAll(r.Body) if err != nil { return err } // Restore the io.ReadCloser to its original state r.Body = io.NopCloser(bytes.NewBuffer(reqBody)) if err = r.ParseForm(); err != nil { return err } req.AppKey = r.Form.Get("appkey") req.ApiName = r.Form.Get("api") req.ApiVersion = r.Form.Get("version") err = json.Unmarshal(reqBody, &req.Body) if err != nil { return err } return nil }