From a79a50102e72acb5970cf28e799cd2f43ff5ab4e Mon Sep 17 00:00:00 2001 From: guonaihong Date: Wed, 29 Jan 2020 21:58:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9SetYAML=E5=87=BD=E6=95=B0=20(?= =?UTF-8?q?#176)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +-- _example/12-yaml.go | 99 ++++++++++++++++++++++++++++++++++++--------- dataflow/req.go | 1 + encode/yaml.go | 24 ++++++++++- encode/yaml_test.go | 14 ++++++- 5 files changed, 120 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 749efdd..58e4e81 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ gout 是go写的http 客户端,为提高工作效率而开发 * 支持设置 GET/PUT/DELETE/PATH/HEAD/OPTIONS * 支持设置请求 http header(可传 struct,map,array,slice 等类型) * 支持设置 URL query(可传 struct,map,array,slice,string 等类型) -* 支持设置 json 编码到请求 body 里面(可传map, struct, string, []byte 等类型) +* 支持设置 json 编码到请求 body 里面(可传struct, map, string, []byte 等类型) * 支持设置 xml 编码到请求 body 里面(可传struct, string, []byte 等类型) -* 支持设置 yaml 编码到请求 body 里面(SetJSON/SetXML/SetYAML) -* 支持设置 form-data(可传 struct,map,array,slice 等类型) +* 支持设置 yaml 编码到请求 body 里面(可传struct, map, string, []byte 等类型) +* 支持设置 form-data(可传 struct, map, array, slice 等类型) * 支持设置 x-www-form-urlencoded(可传 struct,map,array,slice 等类型) * 支持设置 io.Reader,uint/uint8/uint16...int/int8...string...[]byte...float32,float64 至请求 body 里面 * 支持解析响应body里面的json,xml,yaml至结构体里(BindJSON/BindXML/BindYAML) diff --git a/_example/12-yaml.go b/_example/12-yaml.go index 93f4911..11f5c92 100644 --- a/_example/12-yaml.go +++ b/_example/12-yaml.go @@ -12,6 +12,86 @@ type data struct { Data string `json:"data xml:"data" yaml:"data"` } +func useStruct() { + var rsp data + code := 200 + + err := gout.POST(":8080/test.yaml"). + Debug(true). + SetYAML(data{Id: 3, Data: "test data"}). + BindYAML(&rsp). + Code(&code). + Do() + + if err != nil || code != 200 { + fmt.Printf("%v:%d\n", err, code) + } +} + +func useMap() { + var rsp data + code := 200 + + err := gout.POST(":8080/test.yaml"). + Debug(true). + SetYAML(gout.H{"id": 3, "data": "test data"}). + BindYAML(&rsp). + Code(&code). + Do() + + if err != nil || code != 200 { + fmt.Printf("%v:%d\n", err, code) + } +} + +func useString() { + var rsp data + code := 200 + + err := gout.POST(":8080/test.yaml"). + Debug(true). + SetYAML(` +id: 3 +data: test data +`). + BindYAML(&rsp). + Code(&code). + Do() + + if err != nil || code != 200 { + fmt.Printf("%v:%d\n", err, code) + } +} + +func useBytes() { + var rsp data + code := 200 + + err := gout.POST(":8080/test.yaml"). + Debug(true). + SetYAML([]byte(` +id: 3 +data: test data +`)). + BindYAML(&rsp). + Code(&code). + Do() + + if err != nil || code != 200 { + fmt.Printf("%v:%d\n", err, code) + } +} + +func main() { + go server() + time.Sleep(time.Millisecond * 500) //sleep下等服务端真正起好 + + useStruct() + useMap() + useString() + useBytes() +} + func server() { router := gin.Default() @@ -27,22 +107,3 @@ func server() { router.Run() } - -func main() { - var rsp data - go server() - time.Sleep(time.Millisecond * 500) //sleep下等服务端真正起好 - - code := 200 - - err := gout.POST(":8080/test.yaml"). - Debug(true). - SetYAML(data{Id: 3, Data: "test data"}). - BindYAML(&rsp). - Code(&code). - Do() - - if err != nil || code != 200 { - fmt.Printf("%v:%d\n", err, code) - } -} diff --git a/dataflow/req.go b/dataflow/req.go index 009ae61..bbc1f23 100644 --- a/dataflow/req.go +++ b/dataflow/req.go @@ -115,6 +115,7 @@ func (r *Req) addContextType(req *http.Request) { case "xml": req.Header.Add("Content-Type", "application/xml") case "yaml": + req.Header.Add("Content-Type", "application/x-yaml") case "www-form": req.Header.Add("Content-Type", "application/x-www-form-urlencoded") } diff --git a/encode/yaml.go b/encode/yaml.go index 5ec9d37..e9216b5 100644 --- a/encode/yaml.go +++ b/encode/yaml.go @@ -1,10 +1,14 @@ package encode import ( + "errors" + "github.com/guonaihong/gout/core" "gopkg.in/yaml.v2" "io" ) +var ErrNotYAML = errors.New("Not yaml data") + // YAMLEncode yaml encoder structure type YAMLEncode struct { obj interface{} @@ -20,7 +24,14 @@ func NewYAMLEncode(obj interface{}) *YAMLEncode { } // Encode yaml encoder -func (y *YAMLEncode) Encode(w io.Writer) error { +func (y *YAMLEncode) Encode(w io.Writer) (err error) { + if v, ok := core.GetBytes(y.obj); ok { + if b := YAMLValid(v); !b { + return ErrNotYAML + } + _, err = w.Write(v) + return err + } encode := yaml.NewEncoder(w) return encode.Encode(y.obj) } @@ -29,3 +40,14 @@ func (y *YAMLEncode) Encode(w io.Writer) error { func (y *YAMLEncode) Name() string { return "yaml" } + +func YAMLValid(b []byte) bool { + var m map[string]interface{} + + err := yaml.Unmarshal(b, &m) + if err != nil { + return false + } + + return true +} diff --git a/encode/yaml_test.go b/encode/yaml_test.go index a4c7b82..29c11f7 100644 --- a/encode/yaml_test.go +++ b/encode/yaml_test.go @@ -31,7 +31,11 @@ func TestYAMLEncode_Encode(t *testing.T) { out := bytes.Buffer{} - data := []interface{}{need, &need} + s := ` +i: 100 +f: 3.14 +s: test encode yaml` + data := []interface{}{need, &need, s, []byte(s)} for _, v := range data { x := NewYAMLEncode(v) out.Reset() @@ -44,4 +48,12 @@ func TestYAMLEncode_Encode(t *testing.T) { assert.NoError(t, err) assert.Equal(t, got, need) } + + // test fail + for _, v := range []interface{}{`I:100 {}`} { + y := NewYAMLEncode(v) + out.Reset() + err := y.Encode(&out) + assert.Error(t, err) + } }