gin/binding/plain.go
2019-09-04 09:00:59 +08:00

48 lines
678 B
Go

package binding
import (
"fmt"
"io/ioutil"
"net/http"
"reflect"
"unsafe"
)
type plainBinding struct{}
func (plainBinding) Name() string {
return "plain"
}
func (plainBinding) Bind(req *http.Request, obj interface{}) error {
if obj == nil {
return nil
}
v := reflect.ValueOf(obj)
for v.Kind() == reflect.Ptr {
if v.IsNil() {
return nil
}
v = v.Elem()
}
all, err := ioutil.ReadAll(req.Body)
if err != nil {
return err
}
if v.Kind() == reflect.String {
v.SetString(*(*string)(unsafe.Pointer(&all)))
return nil
}
if _, ok := v.Interface().([]byte); ok {
v.SetBytes(all)
return nil
}
return fmt.Errorf("type (%T) unknown type", v)
}