Merge branch 'alexanderdidenko-develop' into develop

This commit is contained in:
Javier Provecho Fernandez 2015-03-08 15:51:26 +01:00
commit d0bf5cdb83
4 changed files with 71 additions and 11 deletions

View File

@ -172,6 +172,47 @@ func main() {
} }
``` ```
###Multipart Form
```go
package main
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
type LoginForm struct {
User string `form:"user" binding:"required"`
Password string `form:"password" binding:"required"`
}
func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
var form LoginForm
c.BindWith(&form, binding.MultipartForm)
if form.User == "user" && form.Password == "password" {
c.JSON(200, gin.H{"status": "you are logged in"})
} else {
c.JSON(401, gin.H{"status": "unauthorized"})
}
})
r.Run(":8080")
}
```
Test it with:
```bash
$ curl -v --form user=user --form password=password http://localhost:8080/login
```
#### Grouping routes #### Grouping routes
```go ```go
func main() { func main() {

View File

@ -25,14 +25,20 @@ type (
// XML binding // XML binding
xmlBinding struct{} xmlBinding struct{}
// // form binding // form binding
formBinding struct{} formBinding struct{}
// multipart form binding
multipartFormBinding struct{}
) )
const MAX_MEMORY = 1 * 1024 * 1024
var ( var (
JSON = jsonBinding{} JSON = jsonBinding{}
XML = xmlBinding{} XML = xmlBinding{}
Form = formBinding{} // todo Form = formBinding{} // todo
MultipartForm = multipartFormBinding{}
) )
func (_ jsonBinding) Bind(req *http.Request, obj interface{}) error { func (_ jsonBinding) Bind(req *http.Request, obj interface{}) error {
@ -63,6 +69,16 @@ func (_ formBinding) Bind(req *http.Request, obj interface{}) error {
return Validate(obj) return Validate(obj)
} }
func (_ multipartFormBinding) Bind(req *http.Request, obj interface{}) error {
if err := req.ParseMultipartForm(MAX_MEMORY); err != nil {
return err
}
if err := mapForm(obj, req.Form); err != nil {
return err
}
return Validate(obj)
}
func mapForm(ptr interface{}, form map[string][]string) error { func mapForm(ptr interface{}, form map[string][]string) error {
typ := reflect.TypeOf(ptr).Elem() typ := reflect.TypeOf(ptr).Elem()
formStruct := reflect.ValueOf(ptr).Elem() formStruct := reflect.ValueOf(ptr).Elem()

View File

@ -295,6 +295,8 @@ func (c *Context) Bind(obj interface{}) bool {
switch { switch {
case c.Request.Method == "GET" || ctype == MIMEPOSTForm: case c.Request.Method == "GET" || ctype == MIMEPOSTForm:
b = binding.Form b = binding.Form
case ctype == MIMEMultipartPOSTForm:
b = binding.MultipartForm
case ctype == MIMEJSON: case ctype == MIMEJSON:
b = binding.JSON b = binding.JSON
case ctype == MIMEXML || ctype == MIMEXML2: case ctype == MIMEXML || ctype == MIMEXML2:

15
gin.go
View File

@ -14,13 +14,14 @@ import (
) )
const ( const (
AbortIndex = math.MaxInt8 / 2 AbortIndex = math.MaxInt8 / 2
MIMEJSON = "application/json" MIMEJSON = "application/json"
MIMEHTML = "text/html" MIMEHTML = "text/html"
MIMEXML = "application/xml" MIMEXML = "application/xml"
MIMEXML2 = "text/xml" MIMEXML2 = "text/xml"
MIMEPlain = "text/plain" MIMEPlain = "text/plain"
MIMEPOSTForm = "application/x-www-form-urlencoded" MIMEPOSTForm = "application/x-www-form-urlencoded"
MIMEMultipartPOSTForm = "multipart/form-data"
) )
type ( type (