1
0
mirror of https://github.com/go-kratos/kratos.git synced 2026-05-22 10:15:24 +02:00

add form encoding (#1138)

* add form encoding

* update examples go mod
This commit is contained in:
youn
2021-07-01 20:36:12 +08:00
committed by GitHub
parent bdb51d2696
commit c268f98404
7 changed files with 99 additions and 5 deletions
+45
View File
@@ -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
}
+47
View File
@@ -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)
}