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