mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-19 15:57:48 +08:00
```go package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.POST("/", func(c *gin.Context) { var s string c.BindPlain(&s) c.String(200, s) }) router.Run() } // client // curl -d "test string" 127.0.0.1:8080 // output // test string ```
48 lines
677 B
Go
48 lines
677 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) unkown type", v)
|
|
}
|