parent
bdb51d2696
commit
c268f98404
@ -0,0 +1,45 @@ |
||||
package form |
||||
|
||||
import ( |
||||
"github.com/go-kratos/kratos/v2/encoding" |
||||
"github.com/gorilla/schema" |
||||
"net/url" |
||||
) |
||||
|
||||
const Name = "x-www-form-urlencoded" |
||||
|
||||
func init() { |
||||
decoder := schema.NewDecoder() |
||||
decoder.SetAliasTag("json") |
||||
encoder := schema.NewEncoder() |
||||
encoder.SetAliasTag("json") |
||||
encoding.RegisterCodec(codec{encoder: encoder, decoder: decoder}) |
||||
} |
||||
|
||||
type codec struct { |
||||
encoder *schema.Encoder |
||||
decoder *schema.Decoder |
||||
} |
||||
|
||||
func (c codec) Marshal(v interface{}) ([]byte, error) { |
||||
var vs = url.Values{} |
||||
if err := c.encoder.Encode(v, vs); err != nil { |
||||
return nil, err |
||||
} |
||||
return []byte(vs.Encode()), nil |
||||
} |
||||
|
||||
func (c codec) Unmarshal(data []byte, v interface{}) error { |
||||
vs, err := url.ParseQuery(string(data)) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
if err := c.decoder.Decode(v, vs); err != nil { |
||||
return err |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func (codec) Name() string { |
||||
return Name |
||||
} |
@ -0,0 +1,47 @@ |
||||
package form |
||||
|
||||
import ( |
||||
"github.com/go-kratos/kratos/v2/encoding" |
||||
"github.com/stretchr/testify/require" |
||||
"testing" |
||||
) |
||||
|
||||
type LoginRequest struct { |
||||
Username string `json:"username,omitempty"` |
||||
Password string `json:"password,omitempty"` |
||||
} |
||||
|
||||
const contentType = "x-www-form-urlencoded" |
||||
|
||||
func TestFormCodecMarshal(t *testing.T) { |
||||
req := &LoginRequest{ |
||||
Username: "kratos", |
||||
Password: "kratos_pwd", |
||||
} |
||||
content, err := encoding.GetCodec(contentType).Marshal(req) |
||||
require.NoError(t, err) |
||||
require.Equal(t, []byte("password=kratos_pwd&username=kratos"), content) |
||||
|
||||
req = &LoginRequest{ |
||||
Username: "kratos", |
||||
Password: "", |
||||
} |
||||
content, err = encoding.GetCodec(contentType).Marshal(req) |
||||
require.NoError(t, err) |
||||
require.Equal(t, []byte("username=kratos"), content) |
||||
} |
||||
|
||||
func TestFormCodecUnmarshal(t *testing.T) { |
||||
req := &LoginRequest{ |
||||
Username: "kratos", |
||||
Password: "kratos_pwd", |
||||
} |
||||
content, err := encoding.GetCodec(contentType).Marshal(req) |
||||
require.NoError(t, err) |
||||
|
||||
var bindReq = new(LoginRequest) |
||||
err = encoding.GetCodec(contentType).Unmarshal(content, bindReq) |
||||
require.NoError(t, err) |
||||
require.Equal(t, "kratos", bindReq.Username) |
||||
require.Equal(t, "kratos_pwd", bindReq.Password) |
||||
} |
Loading…
Reference in new issue