diff --git a/client.go b/client.go
index bc080f3..e3dd134 100644
--- a/client.go
+++ b/client.go
@@ -67,7 +67,7 @@ func (c *Client) Request(method string, url string, args ...any) *Request {
 		reuseBodyEnabled: c.config.ReuseBodyEnabled,
 	}
 
-	r.SetEncoder(JsonEncoder)
+	r.SetEncoder(JsonCodec)
 
 	return r
 }
diff --git a/client_test.go b/client_test.go
index 9e50580..4b69dab 100644
--- a/client_test.go
+++ b/client_test.go
@@ -184,7 +184,7 @@ func TestRequest_Send(t *testing.T) {
 
 	t.Run("", func(t *testing.T) {
 		resp := Post("http://%s", addr).
-			SetEncoder(FormEncoder).
+			SetEncoder(FormCodec).
 			Send(nil)
 		assert.NoError(t, resp.Err())
 	})
@@ -350,7 +350,7 @@ func TestResponse(t *testing.T) {
 	t.Run("204 response", func(t *testing.T) {
 		resp1 := Post("http://%s/204", addr).
 			Debug().
-			SetEncoder(JsonEncoder).
+			SetEncoder(JsonCodec).
 			Send(map[string]any{
 				"name": "xxx",
 			})
@@ -358,7 +358,7 @@ func TestResponse(t *testing.T) {
 
 		resp2 := Post("http://%s/204", addr).
 			Debug().
-			SetEncoder(FormEncoder).
+			SetEncoder(FormCodec).
 			Send(nil)
 		assert.NotNil(t, resp2.Body)
 	})
@@ -367,7 +367,7 @@ func TestResponse(t *testing.T) {
 		var netConn *net.TCPConn
 		resp := Post("http://%s/204", addr).
 			Debug().
-			SetEncoder(FormEncoder).
+			SetEncoder(FormCodec).
 			Send(net.Conn(netConn))
 		assert.Error(t, resp.Err())
 	})
diff --git a/codec.go b/codec.go
index 1df9bb7..8b3d72a 100644
--- a/codec.go
+++ b/codec.go
@@ -27,24 +27,35 @@ const (
 
 type Any map[string]any
 
-type Encoder interface {
-	Encode(v any) (io.Reader, error)
-	ContentType() string
-}
+type (
+	Codec interface {
+		Encoder
+		Decoder
+	}
+
+	Encoder interface {
+		Encode(v any) (io.Reader, error)
+		ContentType() string
+	}
+
+	Decoder interface {
+		Decode(r io.Reader, v any) error
+	}
+)
 
 var (
-	JsonEncoder = new(jsonEncoder)
-	FormEncoder = new(formEncoder)
-	XmlEncoder  = new(xmlEncoder)
+	JsonCodec = new(jsonCodec)
+	FormCodec = new(formCodec)
+	XmlCodec  = new(xmlCodec)
 )
 
 type (
-	jsonEncoder struct{}
-	formEncoder struct{}
-	xmlEncoder  struct{}
+	jsonCodec struct{}
+	formCodec struct{}
+	xmlCodec  struct{}
 )
 
-func (c jsonEncoder) Encode(v any) (io.Reader, error) {
+func (c jsonCodec) Encode(v any) (io.Reader, error) {
 	if v == nil {
 		return nil, nil
 	}
@@ -54,13 +65,15 @@ func (c jsonEncoder) Encode(v any) (io.Reader, error) {
 	return r, errors.WithStack(err)
 }
 
-func (c jsonEncoder) ContentType() string {
+func (c jsonCodec) ContentType() string {
 	return MimeJson
 }
 
-func JsonDecode(r io.Reader, v any) error { return jsoniter.ConfigFastest.NewDecoder(r).Decode(v) }
+func (c jsonCodec) Decode(r io.Reader, v any) error {
+	return jsoniter.ConfigFastest.NewDecoder(r).Decode(v)
+}
 
-func (f formEncoder) Encode(v any) (io.Reader, error) {
+func (f formCodec) Encode(v any) (io.Reader, error) {
 	if v == nil {
 		return nil, nil
 	}
@@ -74,11 +87,11 @@ func (f formEncoder) Encode(v any) (io.Reader, error) {
 	}
 }
 
-func (f formEncoder) ContentType() string {
+func (f formCodec) ContentType() string {
 	return MimeForm
 }
 
-func FormDecode(r io.Reader, v any) error {
+func (f formCodec) Decode(r io.Reader, v any) error {
 	values, ok := v.(*url.Values)
 	if !ok {
 		return errors.Wrap(errUnsupportedData, "v must be *url.Values type")
@@ -95,7 +108,7 @@ func FormDecode(r io.Reader, v any) error {
 	return nil
 }
 
-func (c xmlEncoder) Encode(v any) (io.Reader, error) {
+func (c xmlCodec) Encode(v any) (io.Reader, error) {
 	if v == nil {
 		return nil, nil
 	}
@@ -105,11 +118,11 @@ func (c xmlEncoder) Encode(v any) (io.Reader, error) {
 	return r, errors.WithStack(err)
 }
 
-func (c xmlEncoder) ContentType() string {
+func (c xmlCodec) ContentType() string {
 	return MimeXml
 }
 
-func XmlDecode(r io.Reader, v any) error {
+func (c xmlCodec) Decode(r io.Reader, v any) error {
 	return errors.WithStack(xml.NewDecoder(r).Decode(v))
 }
 
diff --git a/codec_test.go b/codec_test.go
index 3b2e64c..b03a153 100644
--- a/codec_test.go
+++ b/codec_test.go
@@ -15,39 +15,39 @@ import (
 )
 
 func TestForm_encoder_Encode(t *testing.T) {
-	_, err1 := FormEncoder.Encode(struct {
+	_, err1 := FormCodec.Encode(struct {
 		Name string
 	}{Name: "caster"})
 	assert.True(t, errors.Is(err1, errUnsupportedData))
 
-	_, err2 := FormEncoder.Encode(url.Values{
+	_, err2 := FormCodec.Encode(url.Values{
 		"name": []string{"caster"},
 	})
 	assert.NoError(t, err2)
 
-	_, err3 := FormEncoder.Encode(nil)
+	_, err3 := FormCodec.Encode(nil)
 	assert.NoError(t, err3)
 
 	var netConn *net.TCPConn
-	_, err4 := FormEncoder.Encode(net.Conn(netConn))
+	_, err4 := FormCodec.Encode(net.Conn(netConn))
 	assert.Error(t, err4)
 
-	_, err5 := FormEncoder.Encode("a=xxx")
+	_, err5 := FormCodec.Encode("a=xxx")
 	assert.NoError(t, err5)
 }
 
 func TestJson_encoder_Encode(t *testing.T) {
-	_, err1 := JsonEncoder.Encode(struct {
+	_, err1 := JsonCodec.Encode(struct {
 		Name string
 	}{Name: "caster"})
 	assert.NoError(t, err1)
 
-	_, err2 := JsonEncoder.Encode(map[string]interface{}{
+	_, err2 := JsonCodec.Encode(map[string]interface{}{
 		"name": "caster",
 	})
 	assert.NoError(t, err2)
 
-	_, err3 := JsonEncoder.Encode(nil)
+	_, err3 := JsonCodec.Encode(nil)
 	assert.NoError(t, err3)
 }
 
@@ -72,7 +72,7 @@ func TestFormDecode(t *testing.T) {
 	t.Run("ok", func(t *testing.T) {
 		var params = url.Values{}
 		var text = "a=xxx&b=1"
-		var err = FormDecode(strings.NewReader(text), &params)
+		var err = FormCodec.Decode(strings.NewReader(text), &params)
 		assert.NoError(t, err)
 		assert.Equal(t, params["a"][0], "xxx")
 	})
@@ -92,21 +92,21 @@ func TestFormDecode(t *testing.T) {
 
 	t.Run("unsupported type", func(t *testing.T) {
 		var params = url.Values{}
-		var err = FormDecode(strings.NewReader(""), params)
+		var err = FormCodec.Decode(strings.NewReader(""), params)
 		assert.True(t, errors.Is(err, errUnsupportedData))
 	})
 
 	t.Run("error", func(t *testing.T) {
 		var params = url.Values{}
 		var text = "a;b;c"
-		var err = FormDecode(strings.NewReader(text), &params)
+		var err = FormCodec.Decode(strings.NewReader(text), &params)
 		assert.Error(t, err)
 	})
 }
 
 func TestXmlEncoder(t *testing.T) {
 	t.Run("type", func(t *testing.T) {
-		assert.Equal(t, XmlEncoder.ContentType(), MimeXml)
+		assert.Equal(t, XmlCodec.ContentType(), MimeXml)
 	})
 
 	t.Run("", func(t *testing.T) {
@@ -117,12 +117,12 @@ func TestXmlEncoder(t *testing.T) {
 		}{
 			Name: "cas",
 		}
-		_, err := XmlEncoder.Encode(params)
+		_, err := XmlCodec.Encode(params)
 		assert.NoError(t, err)
 	})
 
 	t.Run("nil", func(t *testing.T) {
-		_, err := XmlEncoder.Encode(nil)
+		_, err := XmlCodec.Encode(nil)
 		assert.NoError(t, err)
 	})
 }
@@ -153,7 +153,7 @@ func TestXmlDecode(t *testing.T) {
 	}
 
 	var p = &Peoples{}
-	var err = XmlDecode(strings.NewReader(text), p)
+	var err = XmlCodec.Decode(strings.NewReader(text), p)
 	assert.NoError(t, err)
 
 	t.Run("bind", func(t *testing.T) {
diff --git a/contrib/pb/codec.go b/contrib/pb/codec.go
index 6192253..8f747e2 100644
--- a/contrib/pb/codec.go
+++ b/contrib/pb/codec.go
@@ -14,12 +14,13 @@ import (
 
 var (
 	errDataType = errors.New("v must be proto.Message type")
-	Encoder     = new(encoder)
+
+	Codec = new(codec)
 )
 
-type encoder struct{}
+type codec struct{}
 
-func (c encoder) Encode(v any) (io.Reader, error) {
+func (c codec) Encode(v any) (io.Reader, error) {
 	if v == nil {
 		return nil, nil
 	}
@@ -31,11 +32,11 @@ func (c encoder) Encode(v any) (io.Reader, error) {
 	return bytes.NewReader(p), errors.WithStack(err)
 }
 
-func (c encoder) ContentType() string {
+func (c codec) ContentType() string {
 	return hasaki.MimeProtoBuf
 }
 
-func Decode(r io.Reader, v any) error {
+func (c codec) Decode(r io.Reader, v any) error {
 	message, ok := v.(proto.Message)
 	if !ok {
 		return errors.WithStack(errDataType)
diff --git a/contrib/pb/codec_test.go b/contrib/pb/codec_test.go
index c19e6c1..2a385a4 100644
--- a/contrib/pb/codec_test.go
+++ b/contrib/pb/codec_test.go
@@ -18,23 +18,23 @@ func TestEncoder_Encode(t *testing.T) {
 			Name: "caster",
 			Age:  1,
 		}
-		_, err := Encoder.Encode(req)
+		_, err := Codec.Encode(req)
 		assert.NoError(t, err)
 	})
 
 	t.Run("nil", func(t *testing.T) {
-		_, err := Encoder.Encode(nil)
+		_, err := Codec.Encode(nil)
 		assert.NoError(t, err)
 	})
 
 	t.Run("unexpected type", func(t *testing.T) {
-		_, err := Encoder.Encode(struct{}{})
+		_, err := Codec.Encode(struct{}{})
 		assert.True(t, errors.Is(err, errDataType))
 	})
 }
 
 func TestEncoder_ContentType(t *testing.T) {
-	assert.Equal(t, Encoder.ContentType(), hasaki.MimeProtoBuf)
+	assert.Equal(t, Codec.ContentType(), hasaki.MimeProtoBuf)
 }
 
 func TestDecode(t *testing.T) {
@@ -43,10 +43,10 @@ func TestDecode(t *testing.T) {
 			Name: "caster",
 			Age:  1,
 		}
-		r, _ := Encoder.Encode(req)
+		r, _ := Codec.Encode(req)
 
 		var res = &internal.HelloRequest{}
-		var err = Decode(r, res)
+		var err = Codec.Decode(r, res)
 		assert.NoError(t, err)
 		assert.Equal(t, req.Name, res.Name)
 	})
@@ -56,12 +56,12 @@ func TestDecode(t *testing.T) {
 			Name: "caster",
 			Age:  1,
 		}
-		r, _ := Encoder.Encode(req)
+		r, _ := Codec.Encode(req)
 		p, _ := io.ReadAll(r)
 		br := &internal2.CloserWrapper{B: &bytebufferpool.ByteBuffer{B: p}, R: bytes.NewReader(p)}
 
 		var res = &internal.HelloRequest{}
-		var err = Decode(br, res)
+		var err = Codec.Decode(br, res)
 		assert.NoError(t, err)
 		assert.Equal(t, req.Name, res.Name)
 	})
@@ -71,13 +71,13 @@ func TestDecode(t *testing.T) {
 			Name: "caster",
 			Age:  1,
 		}
-		r, _ := Encoder.Encode(req)
+		r, _ := Codec.Encode(req)
 
 		var res = struct {
 			Name string
 			Age  int
 		}{}
-		var err = Decode(r, &res)
+		var err = Codec.Decode(r, &res)
 		assert.True(t, errors.Is(err, errDataType))
 	})
 }
diff --git a/contrib/yaml/codec.go b/contrib/yaml/codec.go
index 2608b50..4206cd6 100644
--- a/contrib/yaml/codec.go
+++ b/contrib/yaml/codec.go
@@ -12,11 +12,11 @@ import (
 
 //go:generate go mod tidy
 
-var Encoder = new(encoder)
+var Codec = new(codec)
 
-type encoder struct{}
+type codec struct{}
 
-func (c encoder) Encode(v any) (io.Reader, error) {
+func (c codec) Encode(v any) (io.Reader, error) {
 	if v == nil {
 		return nil, nil
 	}
@@ -26,10 +26,10 @@ func (c encoder) Encode(v any) (io.Reader, error) {
 	return r, errors.WithStack(err)
 }
 
-func (c encoder) ContentType() string {
+func (c codec) ContentType() string {
 	return hasaki.MimeYaml
 }
 
-func Decode(r io.Reader, v any) error {
+func (c codec) Decode(r io.Reader, v any) error {
 	return errors.WithStack(yaml.NewDecoder(r).Decode(v))
 }
diff --git a/contrib/yaml/codec_test.go b/contrib/yaml/codec_test.go
index 6959cba..1babd4f 100644
--- a/contrib/yaml/codec_test.go
+++ b/contrib/yaml/codec_test.go
@@ -8,7 +8,7 @@ import (
 )
 
 func TestEncoder_ContentType(t *testing.T) {
-	assert.Equal(t, Encoder.ContentType(), hasaki.MimeYaml)
+	assert.Equal(t, Codec.ContentType(), hasaki.MimeYaml)
 }
 
 func TestEncoder_Encode(t *testing.T) {
@@ -18,12 +18,12 @@ func TestEncoder_Encode(t *testing.T) {
 			Age  int
 		}{Name: "aha"}
 
-		_, err := Encoder.Encode(params)
+		_, err := Codec.Encode(params)
 		assert.NoError(t, err)
 	})
 
 	t.Run("nil", func(t *testing.T) {
-		_, err := Encoder.Encode(nil)
+		_, err := Codec.Encode(nil)
 		assert.NoError(t, err)
 	})
 }
@@ -41,7 +41,7 @@ user:
   name: "caster"
   age: 1
 `
-	var err = Decode(strings.NewReader(text), &params)
+	var err = Codec.Decode(strings.NewReader(text), &params)
 	assert.NoError(t, err)
 	assert.Equal(t, params.User.Name, "caster")
 }
diff --git a/response.go b/response.go
index 3049184..70460a4 100644
--- a/response.go
+++ b/response.go
@@ -37,20 +37,20 @@ func (c *Response) ReadBody() ([]byte, error) {
 	return b, errors.WithStack(err)
 }
 
-func (c *Response) BindJSON(v any) error { return c.Bind(v, JsonDecode) }
+func (c *Response) BindJSON(v any) error { return c.Bind(v, JsonCodec) }
 
-func (c *Response) BindXML(v any) error { return c.Bind(v, XmlDecode) }
+func (c *Response) BindXML(v any) error { return c.Bind(v, XmlCodec) }
 
-func (c *Response) BindForm(v *url.Values) error { return c.Bind(v, FormDecode) }
+func (c *Response) BindForm(v *url.Values) error { return c.Bind(v, FormCodec) }
 
-func (c *Response) Bind(v any, decode func(r io.Reader, ptr any) error) error {
+func (c *Response) Bind(v any, decoder Decoder) error {
 	if c.err != nil {
 		return c.err
 	}
 	if c.Response == nil || c.Body == nil {
 		return errors.WithStack(errEmptyResponse)
 	}
-	err := decode(c.Body, v)
+	err := decoder.Decode(c.Body, v)
 	_ = c.Body.Close()
 	return errors.WithStack(err)
 }