1 Star 1 Fork 0

go-wena / app

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
binding.go 1.46 KB
一键复制 编辑 原始数据 按行查看 历史
k3x 提交于 2021-06-04 14:09 . init
package binding
import (
"fmt"
"net/http"
"reflect"
)
const (
ApplicationJSON = "application/json"
ApplicationXML = "application/xml"
ApplicationForm = "application/x-www-form-urlencoded"
MultipartForm = "multipart/form-data"
)
const defaultMaxMemory = 32 << 20 // 32 MB
func BindRequest(req *http.Request, out interface{}) error {
if out == nil {
return nil
}
rv := reflect.Indirect(reflect.ValueOf(out))
contentType := GetRequestContentType(req)
switch contentType {
case ApplicationJSON:
return bindJSON(req, rv)
case ApplicationForm:
return bindForm(req, rv)
case MultipartForm:
return bindMultipartForm(req, rv)
case ApplicationXML:
fallthrough
default:
return fmt.Errorf("unsupported: %s", contentType)
}
}
func bindJSON(req *http.Request, out interface{}) error {
src, err := jsonSource(req)
if err != nil {
return err
}
return getBinder(req).Bind(src, out)
}
func bindForm(req *http.Request, out interface{}) error {
if err := req.ParseForm(); err != nil {
return err
}
return getBinder(req).Bind(formSource(req.PostForm), out)
}
func bindMultipartForm(req *http.Request, out interface{}) error {
if err := req.ParseMultipartForm(defaultMaxMemory); err != nil {
return err
}
return getBinder(req).Bind(multiSource(req.MultipartForm), out)
}
func getBinder(req *http.Request) binder {
return binder{h: formSource(req.Header), q: formSource(req.URL.Query())}
}
Go
1
https://gitee.com/go-wena/app.git
git@gitee.com:go-wena/app.git
go-wena
app
app
v0.0.11

搜索帮助