mirror of
https://github.com/go-kratos/kratos.git
synced 2026-05-22 10:15:24 +02:00
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user