github.com/wangyougui/gf/v2@v2.6.5/net/ghttp/ghttp_z_unit_feature_request_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package ghttp_test
     8  
     9  import (
    10  	"bytes"
    11  	"fmt"
    12  	"io"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/wangyougui/gf/v2/encoding/gjson"
    17  	"github.com/wangyougui/gf/v2/frame/g"
    18  	"github.com/wangyougui/gf/v2/net/ghttp"
    19  	"github.com/wangyougui/gf/v2/test/gtest"
    20  	"github.com/wangyougui/gf/v2/util/guid"
    21  )
    22  
    23  func Test_Params_Basic(t *testing.T) {
    24  	type User struct {
    25  		Id    int
    26  		Name  string
    27  		Pass1 string `p:"password1"`
    28  		Pass2 string `p:"password2"`
    29  	}
    30  	s := g.Server(guid.S())
    31  	// GET
    32  	s.BindHandler("/get", func(r *ghttp.Request) {
    33  		if r.GetQuery("array") != nil {
    34  			r.Response.Write(r.GetQuery("array"))
    35  		}
    36  		if r.GetQuery("slice") != nil {
    37  			r.Response.Write(r.GetQuery("slice"))
    38  		}
    39  		if r.GetQuery("bool") != nil {
    40  			r.Response.Write(r.GetQuery("bool").Bool())
    41  		}
    42  		if r.GetQuery("float32") != nil {
    43  			r.Response.Write(r.GetQuery("float32").Float32())
    44  		}
    45  		if r.GetQuery("float64") != nil {
    46  			r.Response.Write(r.GetQuery("float64").Float64())
    47  		}
    48  		if r.GetQuery("int") != nil {
    49  			r.Response.Write(r.GetQuery("int").Int())
    50  		}
    51  		if r.GetQuery("uint") != nil {
    52  			r.Response.Write(r.GetQuery("uint").Uint())
    53  		}
    54  		if r.GetQuery("string") != nil {
    55  			r.Response.Write(r.GetQuery("string").String())
    56  		}
    57  		if r.GetQuery("map") != nil {
    58  			r.Response.Write(r.GetQueryMap()["map"].(map[string]interface{})["b"])
    59  		}
    60  		if r.GetQuery("a") != nil {
    61  			r.Response.Write(r.GetQueryMapStrStr()["a"])
    62  		}
    63  	})
    64  	// PUT
    65  	s.BindHandler("/put", func(r *ghttp.Request) {
    66  		if r.Get("array") != nil {
    67  			r.Response.Write(r.Get("array"))
    68  		}
    69  		if r.Get("slice") != nil {
    70  			r.Response.Write(r.Get("slice"))
    71  		}
    72  		if r.Get("bool") != nil {
    73  			r.Response.Write(r.Get("bool").Bool())
    74  		}
    75  		if r.Get("float32") != nil {
    76  			r.Response.Write(r.Get("float32").Float32())
    77  		}
    78  		if r.Get("float64") != nil {
    79  			r.Response.Write(r.Get("float64").Float64())
    80  		}
    81  		if r.Get("int") != nil {
    82  			r.Response.Write(r.Get("int").Int())
    83  		}
    84  		if r.Get("uint") != nil {
    85  			r.Response.Write(r.Get("uint").Uint())
    86  		}
    87  		if r.Get("string") != nil {
    88  			r.Response.Write(r.Get("string").String())
    89  		}
    90  		if r.Get("map") != nil {
    91  			r.Response.Write(r.GetMap()["map"].(map[string]interface{})["b"])
    92  		}
    93  		if r.Get("a") != nil {
    94  			r.Response.Write(r.GetMapStrStr()["a"])
    95  		}
    96  	})
    97  
    98  	// DELETE
    99  	s.BindHandler("/delete", func(r *ghttp.Request) {
   100  		if r.Get("array") != nil {
   101  			r.Response.Write(r.Get("array"))
   102  		}
   103  		if r.Get("slice") != nil {
   104  			r.Response.Write(r.Get("slice"))
   105  		}
   106  		if r.Get("bool") != nil {
   107  			r.Response.Write(r.Get("bool").Bool())
   108  		}
   109  		if r.Get("float32") != nil {
   110  			r.Response.Write(r.Get("float32").Float32())
   111  		}
   112  		if r.Get("float64") != nil {
   113  			r.Response.Write(r.Get("float64").Float64())
   114  		}
   115  		if r.Get("int") != nil {
   116  			r.Response.Write(r.Get("int").Int())
   117  		}
   118  		if r.Get("uint") != nil {
   119  			r.Response.Write(r.Get("uint").Uint())
   120  		}
   121  		if r.Get("string") != nil {
   122  			r.Response.Write(r.Get("string").String())
   123  		}
   124  		if r.Get("map") != nil {
   125  			r.Response.Write(r.GetMap()["map"].(map[string]interface{})["b"])
   126  		}
   127  		if r.Get("a") != nil {
   128  			r.Response.Write(r.GetMapStrStr()["a"])
   129  		}
   130  	})
   131  	// PATCH
   132  	s.BindHandler("/patch", func(r *ghttp.Request) {
   133  		if r.Get("array") != nil {
   134  			r.Response.Write(r.Get("array"))
   135  		}
   136  		if r.Get("slice") != nil {
   137  			r.Response.Write(r.Get("slice"))
   138  		}
   139  		if r.Get("bool") != nil {
   140  			r.Response.Write(r.Get("bool").Bool())
   141  		}
   142  		if r.Get("float32") != nil {
   143  			r.Response.Write(r.Get("float32").Float32())
   144  		}
   145  		if r.Get("float64") != nil {
   146  			r.Response.Write(r.Get("float64").Float64())
   147  		}
   148  		if r.Get("int") != nil {
   149  			r.Response.Write(r.Get("int").Int())
   150  		}
   151  		if r.Get("uint") != nil {
   152  			r.Response.Write(r.Get("uint").Uint())
   153  		}
   154  		if r.Get("string") != nil {
   155  			r.Response.Write(r.Get("string").String())
   156  		}
   157  		if r.Get("map") != nil {
   158  			r.Response.Write(r.GetMap()["map"].(map[string]interface{})["b"])
   159  		}
   160  		if r.Get("a") != nil {
   161  			r.Response.Write(r.GetMapStrStr()["a"])
   162  		}
   163  	})
   164  	// Form
   165  	s.BindHandler("/form", func(r *ghttp.Request) {
   166  		if r.Get("array") != nil {
   167  			r.Response.Write(r.GetForm("array"))
   168  		}
   169  		if r.Get("slice") != nil {
   170  			r.Response.Write(r.GetForm("slice"))
   171  		}
   172  		if r.Get("bool") != nil {
   173  			r.Response.Write(r.GetForm("bool").Bool())
   174  		}
   175  		if r.Get("float32") != nil {
   176  			r.Response.Write(r.GetForm("float32").Float32())
   177  		}
   178  		if r.Get("float64") != nil {
   179  			r.Response.Write(r.GetForm("float64").Float64())
   180  		}
   181  		if r.Get("int") != nil {
   182  			r.Response.Write(r.GetForm("int").Int())
   183  		}
   184  		if r.Get("uint") != nil {
   185  			r.Response.Write(r.GetForm("uint").Uint())
   186  		}
   187  		if r.Get("string") != nil {
   188  			r.Response.Write(r.GetForm("string").String())
   189  		}
   190  		if r.Get("map") != nil {
   191  			r.Response.Write(r.GetFormMap()["map"].(map[string]interface{})["b"])
   192  		}
   193  		if r.Get("a") != nil {
   194  			r.Response.Write(r.GetFormMapStrStr()["a"])
   195  		}
   196  	})
   197  	s.BindHandler("/map", func(r *ghttp.Request) {
   198  		if m := r.GetQueryMap(); len(m) > 0 {
   199  			r.Response.Write(m["name"])
   200  			return
   201  		}
   202  		if m := r.GetMap(); len(m) > 0 {
   203  			r.Response.Write(m["name"])
   204  			return
   205  		}
   206  	})
   207  	s.BindHandler("/raw", func(r *ghttp.Request) {
   208  		r.Response.Write(r.GetBody())
   209  	})
   210  	s.BindHandler("/json", func(r *ghttp.Request) {
   211  		j, err := r.GetJson()
   212  		if err != nil {
   213  			r.Response.Write(err)
   214  			return
   215  		}
   216  		r.Response.Write(j.Get("name"))
   217  	})
   218  	s.BindHandler("/struct", func(r *ghttp.Request) {
   219  		if m := r.GetQueryMap(); len(m) > 0 {
   220  			user := new(User)
   221  			r.GetQueryStruct(user)
   222  			r.Response.Write(user.Id, user.Name, user.Pass1, user.Pass2)
   223  			return
   224  		}
   225  		if m := r.GetMap(); len(m) > 0 {
   226  			user := new(User)
   227  			r.GetStruct(user)
   228  			r.Response.Write(user.Id, user.Name, user.Pass1, user.Pass2)
   229  			return
   230  		}
   231  	})
   232  	s.BindHandler("/struct-with-nil", func(r *ghttp.Request) {
   233  		user := (*User)(nil)
   234  		err := r.GetStruct(&user)
   235  		r.Response.Write(err)
   236  	})
   237  	s.BindHandler("/struct-with-base", func(r *ghttp.Request) {
   238  		type Base struct {
   239  			Pass1 string `p:"password1"`
   240  			Pass2 string `p:"password2"`
   241  		}
   242  		type UserWithBase1 struct {
   243  			Id   int
   244  			Name string
   245  			Base
   246  		}
   247  		type UserWithBase2 struct {
   248  			Id   int
   249  			Name string
   250  			Pass Base
   251  		}
   252  		if m := r.GetMap(); len(m) > 0 {
   253  			user1 := new(UserWithBase1)
   254  			user2 := new(UserWithBase2)
   255  			r.GetStruct(user1)
   256  			r.GetStruct(user2)
   257  			r.Response.Write(user1.Id, user1.Name, user1.Pass1, user1.Pass2)
   258  			r.Response.Write(user2.Id, user2.Name, user2.Pass.Pass1, user2.Pass.Pass2)
   259  		}
   260  	})
   261  	s.SetDumpRouterMap(false)
   262  	s.Start()
   263  	defer s.Shutdown()
   264  
   265  	time.Sleep(100 * time.Millisecond)
   266  	gtest.C(t, func(t *gtest.T) {
   267  		client := g.Client()
   268  		client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   269  		// GET
   270  		t.Assert(client.GetContent(ctx, "/get", "array[]=1&array[]=2"), `["1","2"]`)
   271  		t.Assert(client.GetContent(ctx, "/get", "slice=1&slice=2"), `2`)
   272  		t.Assert(client.GetContent(ctx, "/get", "bool=1"), `true`)
   273  		t.Assert(client.GetContent(ctx, "/get", "bool=0"), `false`)
   274  		t.Assert(client.GetContent(ctx, "/get", "float32=0.11"), `0.11`)
   275  		t.Assert(client.GetContent(ctx, "/get", "float64=0.22"), `0.22`)
   276  		t.Assert(client.GetContent(ctx, "/get", "int=-10000"), `-10000`)
   277  		t.Assert(client.GetContent(ctx, "/get", "int=10000"), `10000`)
   278  		t.Assert(client.GetContent(ctx, "/get", "uint=10000"), `10000`)
   279  		t.Assert(client.GetContent(ctx, "/get", "uint=9"), `9`)
   280  		t.Assert(client.GetContent(ctx, "/get", "string=key"), `key`)
   281  		t.Assert(client.GetContent(ctx, "/get", "map[a]=1&map[b]=2"), `2`)
   282  		t.Assert(client.GetContent(ctx, "/get", "a=1&b=2"), `1`)
   283  
   284  		// PUT
   285  		t.Assert(client.PutContent(ctx, "/put", "array[]=1&array[]=2"), `["1","2"]`)
   286  		t.Assert(client.PutContent(ctx, "/put", "slice=1&slice=2"), `2`)
   287  		t.Assert(client.PutContent(ctx, "/put", "bool=1"), `true`)
   288  		t.Assert(client.PutContent(ctx, "/put", "bool=0"), `false`)
   289  		t.Assert(client.PutContent(ctx, "/put", "float32=0.11"), `0.11`)
   290  		t.Assert(client.PutContent(ctx, "/put", "float64=0.22"), `0.22`)
   291  		t.Assert(client.PutContent(ctx, "/put", "int=-10000"), `-10000`)
   292  		t.Assert(client.PutContent(ctx, "/put", "int=10000"), `10000`)
   293  		t.Assert(client.PutContent(ctx, "/put", "uint=10000"), `10000`)
   294  		t.Assert(client.PutContent(ctx, "/put", "uint=9"), `9`)
   295  		t.Assert(client.PutContent(ctx, "/put", "string=key"), `key`)
   296  		t.Assert(client.PutContent(ctx, "/put", "map[a]=1&map[b]=2"), `2`)
   297  		t.Assert(client.PutContent(ctx, "/put", "a=1&b=2"), `1`)
   298  
   299  		// DELETE
   300  		t.Assert(client.DeleteContent(ctx, "/delete", "array[]=1&array[]=2"), `["1","2"]`)
   301  		t.Assert(client.DeleteContent(ctx, "/delete", "slice=1&slice=2"), `2`)
   302  		t.Assert(client.DeleteContent(ctx, "/delete", "bool=1"), `true`)
   303  		t.Assert(client.DeleteContent(ctx, "/delete", "bool=0"), `false`)
   304  		t.Assert(client.DeleteContent(ctx, "/delete", "float32=0.11"), `0.11`)
   305  		t.Assert(client.DeleteContent(ctx, "/delete", "float64=0.22"), `0.22`)
   306  		t.Assert(client.DeleteContent(ctx, "/delete", "int=-10000"), `-10000`)
   307  		t.Assert(client.DeleteContent(ctx, "/delete", "int=10000"), `10000`)
   308  		t.Assert(client.DeleteContent(ctx, "/delete", "uint=10000"), `10000`)
   309  		t.Assert(client.DeleteContent(ctx, "/delete", "uint=9"), `9`)
   310  		t.Assert(client.DeleteContent(ctx, "/delete", "string=key"), `key`)
   311  		t.Assert(client.DeleteContent(ctx, "/delete", "map[a]=1&map[b]=2"), `2`)
   312  		t.Assert(client.DeleteContent(ctx, "/delete", "a=1&b=2"), `1`)
   313  
   314  		// PATCH
   315  		t.Assert(client.PatchContent(ctx, "/patch", "array[]=1&array[]=2"), `["1","2"]`)
   316  		t.Assert(client.PatchContent(ctx, "/patch", "slice=1&slice=2"), `2`)
   317  		t.Assert(client.PatchContent(ctx, "/patch", "bool=1"), `true`)
   318  		t.Assert(client.PatchContent(ctx, "/patch", "bool=0"), `false`)
   319  		t.Assert(client.PatchContent(ctx, "/patch", "float32=0.11"), `0.11`)
   320  		t.Assert(client.PatchContent(ctx, "/patch", "float64=0.22"), `0.22`)
   321  		t.Assert(client.PatchContent(ctx, "/patch", "int=-10000"), `-10000`)
   322  		t.Assert(client.PatchContent(ctx, "/patch", "int=10000"), `10000`)
   323  		t.Assert(client.PatchContent(ctx, "/patch", "uint=10000"), `10000`)
   324  		t.Assert(client.PatchContent(ctx, "/patch", "uint=9"), `9`)
   325  		t.Assert(client.PatchContent(ctx, "/patch", "string=key"), `key`)
   326  		t.Assert(client.PatchContent(ctx, "/patch", "map[a]=1&map[b]=2"), `2`)
   327  		t.Assert(client.PatchContent(ctx, "/patch", "a=1&b=2"), `1`)
   328  
   329  		// Form
   330  		t.Assert(client.PostContent(ctx, "/form", "array[]=1&array[]=2"), `["1","2"]`)
   331  		t.Assert(client.PostContent(ctx, "/form", "slice=1&slice=2"), `2`)
   332  		t.Assert(client.PostContent(ctx, "/form", "bool=1"), `true`)
   333  		t.Assert(client.PostContent(ctx, "/form", "bool=0"), `false`)
   334  		t.Assert(client.PostContent(ctx, "/form", "float32=0.11"), `0.11`)
   335  		t.Assert(client.PostContent(ctx, "/form", "float64=0.22"), `0.22`)
   336  		t.Assert(client.PostContent(ctx, "/form", "int=-10000"), `-10000`)
   337  		t.Assert(client.PostContent(ctx, "/form", "int=10000"), `10000`)
   338  		t.Assert(client.PostContent(ctx, "/form", "uint=10000"), `10000`)
   339  		t.Assert(client.PostContent(ctx, "/form", "uint=9"), `9`)
   340  		t.Assert(client.PostContent(ctx, "/form", "string=key"), `key`)
   341  		t.Assert(client.PostContent(ctx, "/form", "map[a]=1&map[b]=2"), `2`)
   342  		t.Assert(client.PostContent(ctx, "/form", "a=1&b=2"), `1`)
   343  
   344  		// Map
   345  		t.Assert(client.GetContent(ctx, "/map", "id=1&name=john"), `john`)
   346  		t.Assert(client.PostContent(ctx, "/map", "id=1&name=john"), `john`)
   347  
   348  		// Raw
   349  		t.Assert(client.PutContent(ctx, "/raw", "id=1&name=john"), `id=1&name=john`)
   350  
   351  		// Json
   352  		t.Assert(client.PostContent(ctx, "/json", `{"id":1, "name":"john"}`), `john`)
   353  
   354  		// Struct
   355  		t.Assert(client.GetContent(ctx, "/struct", `id=1&name=john&password1=123&password2=456`), `1john123456`)
   356  		t.Assert(client.PostContent(ctx, "/struct", `id=1&name=john&password1=123&password2=456`), `1john123456`)
   357  		t.Assert(client.PostContent(ctx, "/struct-with-nil", ``), ``)
   358  		t.Assert(client.PostContent(ctx, "/struct-with-base", `id=1&name=john&password1=123&password2=456`), "1john1234561john")
   359  	})
   360  }
   361  
   362  func Test_Params_Header(t *testing.T) {
   363  	s := g.Server(guid.S())
   364  	s.BindHandler("/header", func(r *ghttp.Request) {
   365  		r.Response.Write(r.GetHeader("test"))
   366  	})
   367  	s.SetDumpRouterMap(false)
   368  	s.Start()
   369  	defer s.Shutdown()
   370  
   371  	time.Sleep(100 * time.Millisecond)
   372  	gtest.C(t, func(t *gtest.T) {
   373  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   374  		client := g.Client()
   375  		client.SetPrefix(prefix)
   376  
   377  		t.Assert(client.Header(g.MapStrStr{"test": "123456"}).GetContent(ctx, "/header"), "123456")
   378  	})
   379  }
   380  
   381  func Test_Params_SupportChars(t *testing.T) {
   382  	s := g.Server(guid.S())
   383  	s.BindHandler("/form-value", func(r *ghttp.Request) {
   384  		r.Response.Write(r.GetForm("test-value"))
   385  	})
   386  	s.BindHandler("/form-array", func(r *ghttp.Request) {
   387  		r.Response.Write(r.GetForm("test-array"))
   388  	})
   389  	s.SetDumpRouterMap(false)
   390  	s.Start()
   391  	defer s.Shutdown()
   392  
   393  	time.Sleep(100 * time.Millisecond)
   394  	gtest.C(t, func(t *gtest.T) {
   395  		c := g.Client()
   396  		c.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
   397  		t.Assert(c.PostContent(ctx, "/form-value", "test-value=100"), "100")
   398  		t.Assert(c.PostContent(ctx, "/form-array", "test-array[]=1&test-array[]=2"), `["1","2"]`)
   399  	})
   400  }
   401  
   402  func Test_Params_Priority(t *testing.T) {
   403  	s := g.Server(guid.S())
   404  	s.BindHandler("/query", func(r *ghttp.Request) {
   405  		r.Response.Write(r.GetQuery("a"))
   406  	})
   407  	s.BindHandler("/form", func(r *ghttp.Request) {
   408  		r.Response.Write(r.GetForm("a"))
   409  	})
   410  	s.BindHandler("/request", func(r *ghttp.Request) {
   411  		r.Response.Write(r.Get("a"))
   412  	})
   413  	s.BindHandler("/request-map", func(r *ghttp.Request) {
   414  		r.Response.Write(r.GetMap(g.Map{
   415  			"a": 1,
   416  			"b": 2,
   417  		}))
   418  	})
   419  	s.SetDumpRouterMap(false)
   420  	s.Start()
   421  	defer s.Shutdown()
   422  
   423  	time.Sleep(100 * time.Millisecond)
   424  	gtest.C(t, func(t *gtest.T) {
   425  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   426  		client := g.Client()
   427  		client.SetPrefix(prefix)
   428  
   429  		t.Assert(client.GetContent(ctx, "/query?a=1", "a=100"), "100")
   430  		t.Assert(client.PostContent(ctx, "/form?a=1", "a=100"), "100")
   431  		t.Assert(client.PutContent(ctx, "/form?a=1", "a=100"), "100")
   432  		t.Assert(client.GetContent(ctx, "/request?a=1", "a=100"), "100")
   433  		t.Assert(client.GetContent(ctx, "/request-map?a=1&b=2&c=3", "a=100&b=200&c=300"), `{"a":"100","b":"200"}`)
   434  	})
   435  }
   436  
   437  func Test_Params_GetRequestMap(t *testing.T) {
   438  	s := g.Server(guid.S())
   439  	s.BindHandler("/map", func(r *ghttp.Request) {
   440  		r.Response.Write(r.GetRequestMap())
   441  	})
   442  	s.BindHandler("/withKVMap", func(r *ghttp.Request) {
   443  		m := r.GetRequestMap(map[string]interface{}{"id": 2})
   444  		r.Response.Write(m["id"])
   445  	})
   446  	s.BindHandler("/paramsMapWithKVMap", func(r *ghttp.Request) {
   447  		r.SetParam("name", "john")
   448  		m := r.GetRequestMap(map[string]interface{}{"id": 2})
   449  		r.Response.Write(m["id"])
   450  	})
   451  	s.BindHandler("/{name}.map", func(r *ghttp.Request) {
   452  		m := r.GetRequestMap(map[string]interface{}{"id": 2})
   453  		r.Response.Write(m["id"])
   454  	})
   455  	s.SetDumpRouterMap(false)
   456  	s.Start()
   457  	defer s.Shutdown()
   458  
   459  	time.Sleep(100 * time.Millisecond)
   460  	gtest.C(t, func(t *gtest.T) {
   461  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   462  		client := g.Client()
   463  		client.SetPrefix(prefix)
   464  
   465  		t.Assert(
   466  			client.PostContent(ctx,
   467  				"/map",
   468  				"time_end2020-04-18 16:11:58&returnmsg=Success&attach=",
   469  			),
   470  			`{"attach":"","returnmsg":"Success"}`,
   471  		)
   472  
   473  		t.Assert(client.PostContent(ctx, "/john.map", "name=john"), 2)
   474  
   475  		t.Assert(client.PostContent(ctx, "/withKVMap", "name=john"), 2)
   476  
   477  		t.Assert(client.PostContent(ctx, "/paramsMapWithKVMap"), 2)
   478  
   479  		client.SetContentType("application/json")
   480  		t.Assert(client.GetContent(ctx, "/withKVMap", "name=john"), 2)
   481  	})
   482  }
   483  
   484  func Test_Params_Modify(t *testing.T) {
   485  	s := g.Server(guid.S())
   486  	s.BindHandler("/param/modify", func(r *ghttp.Request) {
   487  		param := r.GetMap()
   488  		param["id"] = 2
   489  		paramBytes, err := gjson.Encode(param)
   490  		if err != nil {
   491  			r.Response.Write(err)
   492  			return
   493  		}
   494  		r.Request.Body = io.NopCloser(bytes.NewReader(paramBytes))
   495  		r.ReloadParam()
   496  		r.Response.Write(r.GetMap())
   497  	})
   498  	s.SetDumpRouterMap(false)
   499  	s.Start()
   500  	defer s.Shutdown()
   501  
   502  	time.Sleep(100 * time.Millisecond)
   503  	gtest.C(t, func(t *gtest.T) {
   504  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   505  		client := g.Client()
   506  		client.SetPrefix(prefix)
   507  
   508  		t.Assert(
   509  			client.PostContent(ctx,
   510  				"/param/modify",
   511  				`{"id":1}`,
   512  			),
   513  			`{"id":2}`,
   514  		)
   515  	})
   516  }
   517  
   518  func Test_Params_Parse_DefaultValueTag(t *testing.T) {
   519  	type T struct {
   520  		Name  string  `d:"john"`
   521  		Score float32 `d:"60"`
   522  	}
   523  	s := g.Server(guid.S())
   524  	s.BindHandler("/parse", func(r *ghttp.Request) {
   525  		var t *T
   526  		if err := r.Parse(&t); err != nil {
   527  			r.Response.WriteExit(err)
   528  		}
   529  		r.Response.WriteExit(t)
   530  	})
   531  	s.SetDumpRouterMap(false)
   532  	s.Start()
   533  	defer s.Shutdown()
   534  
   535  	time.Sleep(100 * time.Millisecond)
   536  	gtest.C(t, func(t *gtest.T) {
   537  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   538  		client := g.Client()
   539  		client.SetPrefix(prefix)
   540  
   541  		t.Assert(client.PostContent(ctx, "/parse"), `{"Name":"john","Score":60}`)
   542  		t.Assert(client.PostContent(ctx, "/parse", `{"name":"smith"}`), `{"Name":"smith","Score":60}`)
   543  		t.Assert(client.PostContent(ctx, "/parse", `{"name":"smith", "score":100}`), `{"Name":"smith","Score":100}`)
   544  	})
   545  }
   546  
   547  func Test_Params_Parse_Validation(t *testing.T) {
   548  	type RegisterReq struct {
   549  		Name  string `p:"username"  v:"required|length:6,30#请输入账号|账号长度为{min}到{max}位"`
   550  		Pass  string `p:"password1" v:"required|length:6,30#请输入密码|密码长度不够"`
   551  		Pass2 string `p:"password2" v:"required|length:6,30|same:password1#请确认密码|密码长度不够|两次密码不一致"`
   552  	}
   553  
   554  	s := g.Server(guid.S())
   555  	s.BindHandler("/parse", func(r *ghttp.Request) {
   556  		var req *RegisterReq
   557  		if err := r.Parse(&req); err != nil {
   558  			r.Response.Write(err)
   559  		} else {
   560  			r.Response.Write("ok")
   561  		}
   562  	})
   563  	s.SetDumpRouterMap(false)
   564  	s.Start()
   565  	defer s.Shutdown()
   566  
   567  	time.Sleep(100 * time.Millisecond)
   568  	gtest.C(t, func(t *gtest.T) {
   569  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   570  		client := g.Client()
   571  		client.SetPrefix(prefix)
   572  
   573  		t.Assert(client.GetContent(ctx, "/parse"), `请输入账号`)
   574  		t.Assert(client.GetContent(ctx, "/parse?name=john11&password1=123456&password2=123"), `密码长度不够`)
   575  		t.Assert(client.GetContent(ctx, "/parse?name=john&password1=123456&password2=123456"), `账号长度为6到30位`)
   576  		t.Assert(client.GetContent(ctx, "/parse?name=john11&password1=123456&password2=123456"), `ok`)
   577  	})
   578  }
   579  
   580  func Test_Params_Parse_EmbeddedWithAliasName1(t *testing.T) {
   581  	// 获取内容列表
   582  	type ContentGetListInput struct {
   583  		Type       string
   584  		CategoryId uint
   585  		Page       int
   586  		Size       int
   587  		Sort       int
   588  		UserId     uint
   589  	}
   590  	// 获取内容列表
   591  	type ContentGetListReq struct {
   592  		ContentGetListInput
   593  		CategoryId uint `p:"cate"`
   594  		Page       int  `d:"1"  v:"min:0#分页号码错误"`
   595  		Size       int  `d:"10" v:"max:50#分页数量最大50条"`
   596  	}
   597  
   598  	s := g.Server(guid.S())
   599  	s.BindHandler("/parse", func(r *ghttp.Request) {
   600  		var req *ContentGetListReq
   601  		if err := r.Parse(&req); err != nil {
   602  			r.Response.Write(err)
   603  		} else {
   604  			r.Response.Write(req.ContentGetListInput)
   605  		}
   606  	})
   607  	s.SetDumpRouterMap(false)
   608  	s.Start()
   609  	defer s.Shutdown()
   610  
   611  	time.Sleep(100 * time.Millisecond)
   612  	gtest.C(t, func(t *gtest.T) {
   613  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   614  		client := g.Client()
   615  		client.SetPrefix(prefix)
   616  
   617  		t.Assert(client.GetContent(ctx, "/parse?cate=1&page=2&size=10"), `{"Type":"","CategoryId":0,"Page":2,"Size":10,"Sort":0,"UserId":0}`)
   618  	})
   619  }
   620  
   621  func Test_Params_Parse_EmbeddedWithAliasName2(t *testing.T) {
   622  	// 获取内容列表
   623  	type ContentGetListInput struct {
   624  		Type       string
   625  		CategoryId uint `p:"cate"`
   626  		Page       int
   627  		Size       int
   628  		Sort       int
   629  		UserId     uint
   630  	}
   631  	// 获取内容列表
   632  	type ContentGetListReq struct {
   633  		ContentGetListInput
   634  		CategoryId uint `p:"cate"`
   635  		Page       int  `d:"1"  v:"min:0#分页号码错误"`
   636  		Size       int  `d:"10" v:"max:50#分页数量最大50条"`
   637  	}
   638  
   639  	s := g.Server(guid.S())
   640  	s.BindHandler("/parse", func(r *ghttp.Request) {
   641  		var req *ContentGetListReq
   642  		if err := r.Parse(&req); err != nil {
   643  			r.Response.Write(err)
   644  		} else {
   645  			r.Response.Write(req.ContentGetListInput)
   646  		}
   647  	})
   648  	s.SetDumpRouterMap(false)
   649  	s.Start()
   650  	defer s.Shutdown()
   651  
   652  	time.Sleep(100 * time.Millisecond)
   653  	gtest.C(t, func(t *gtest.T) {
   654  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   655  		client := g.Client()
   656  		client.SetPrefix(prefix)
   657  
   658  		t.Assert(client.GetContent(ctx, "/parse?cate=1&page=2&size=10"), `{"Type":"","CategoryId":1,"Page":2,"Size":10,"Sort":0,"UserId":0}`)
   659  	})
   660  }
   661  
   662  func Test_Params_GetParam(t *testing.T) {
   663  	s := g.Server(guid.S())
   664  	s.BindHandler("/", func(r *ghttp.Request) {
   665  		r.Response.Write(r.GetParam("key", "val"))
   666  	})
   667  	s.SetDumpRouterMap(false)
   668  	s.Start()
   669  	defer s.Shutdown()
   670  
   671  	time.Sleep(100 * time.Millisecond)
   672  	gtest.C(t, func(t *gtest.T) {
   673  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   674  		client := g.Client()
   675  		client.SetPrefix(prefix)
   676  
   677  		t.Assert(client.PostContent(ctx, "/"), "val")
   678  	})
   679  }
   680  
   681  func Test_Params_SetQuery(t *testing.T) {
   682  	s := g.Server(guid.S())
   683  	s.BindHandler("/SetQuery", func(r *ghttp.Request) {
   684  		r.SetQuery("a", 100)
   685  		r.Response.Write(r.GetQuery("a"))
   686  	})
   687  	s.SetDumpRouterMap(false)
   688  	s.Start()
   689  	defer s.Shutdown()
   690  
   691  	time.Sleep(100 * time.Millisecond)
   692  	gtest.C(t, func(t *gtest.T) {
   693  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   694  		client := g.Client()
   695  		client.SetPrefix(prefix)
   696  
   697  		t.Assert(client.GetContent(ctx, "/SetQuery"), "100")
   698  		t.Assert(client.GetContent(ctx, "/SetQuery?a=1"), "100")
   699  	})
   700  }
   701  
   702  func Test_Params_GetQuery(t *testing.T) {
   703  	s := g.Server(guid.S())
   704  	s.BindHandler("/GetQuery", func(r *ghttp.Request) {
   705  		r.Response.Write(r.GetQuery("a", 200))
   706  	})
   707  	s.SetDumpRouterMap(false)
   708  	s.Start()
   709  	defer s.Shutdown()
   710  
   711  	time.Sleep(100 * time.Millisecond)
   712  	gtest.C(t, func(t *gtest.T) {
   713  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   714  		client := g.Client()
   715  		client.SetPrefix(prefix)
   716  
   717  		t.Assert(client.GetContent(ctx, "/GetQuery"), 200)
   718  		t.Assert(client.SetContentType("application/json").GetContent(ctx, "/GetQuery", "a=100"), 100)
   719  	})
   720  }
   721  
   722  func Test_Params_GetQueryMap(t *testing.T) {
   723  	s := g.Server(guid.S())
   724  	s.BindHandler("/GetQueryMap", func(r *ghttp.Request) {
   725  		if m := r.GetQueryMap(); len(m) > 0 {
   726  			r.Response.Write(m["name"])
   727  		}
   728  	})
   729  	s.BindHandler("/GetQueryMapWithKVMap", func(r *ghttp.Request) {
   730  		if m := r.GetQueryMap(map[string]interface{}{"id": 1}); len(m) > 0 {
   731  			r.Response.Write(m["id"])
   732  		}
   733  	})
   734  	s.SetDumpRouterMap(false)
   735  	s.Start()
   736  	defer s.Shutdown()
   737  
   738  	time.Sleep(100 * time.Millisecond)
   739  
   740  	gtest.C(t, func(t *gtest.T) {
   741  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   742  		client := g.Client()
   743  		client.SetPrefix(prefix)
   744  		client.SetContentType("application/json")
   745  		t.Assert(client.GetContent(ctx, "/GetQueryMap", "id=1&name=john"), `john`)
   746  	})
   747  	gtest.C(t, func(t *gtest.T) {
   748  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   749  		client := g.Client()
   750  		client.SetPrefix(prefix)
   751  		t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap"), 1)
   752  		t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "name=john"), 1)
   753  		t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "id=2&name=john"), 2)
   754  		client.SetContentType("application/json")
   755  		t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "name=john"), 1)
   756  		t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "id=2&name=john"), 2)
   757  	})
   758  }
   759  
   760  func Test_Params_GetQueryMapStrStr(t *testing.T) {
   761  	s := g.Server(guid.S())
   762  	s.BindHandler("/GetQueryMapStrStr", func(r *ghttp.Request) {
   763  		r.Response.Write(r.GetQueryMapStrStr())
   764  	})
   765  	s.SetDumpRouterMap(false)
   766  	s.Start()
   767  	defer s.Shutdown()
   768  
   769  	time.Sleep(100 * time.Millisecond)
   770  	gtest.C(t, func(t *gtest.T) {
   771  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   772  		client := g.Client()
   773  		client.SetPrefix(prefix)
   774  
   775  		t.Assert(client.GetContent(ctx, "/GetQueryMapStrStr"), "")
   776  	})
   777  }
   778  
   779  func Test_Params_GetQueryMapStrVar(t *testing.T) {
   780  	s := g.Server(guid.S())
   781  	s.BindHandler("/GetQueryMapStrVar", func(r *ghttp.Request) {
   782  		m := r.GetQueryMapStrVar()
   783  		r.Response.Write(m["id"])
   784  	})
   785  	s.SetDumpRouterMap(false)
   786  	s.Start()
   787  	defer s.Shutdown()
   788  
   789  	time.Sleep(100 * time.Millisecond)
   790  	gtest.C(t, func(t *gtest.T) {
   791  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   792  		client := g.Client()
   793  		client.SetPrefix(prefix)
   794  
   795  		t.Assert(client.GetContent(ctx, "/GetQueryMapStrVar"), "")
   796  		t.Assert(client.GetContent(ctx, "/GetQueryMapStrVar", "id=1"), 1)
   797  	})
   798  }
   799  
   800  func Test_Params_GetRequest(t *testing.T) {
   801  	s := g.Server(guid.S())
   802  	s.BindHandler("/GetRequest", func(r *ghttp.Request) {
   803  		r.Response.Write(r.GetRequest("id"))
   804  	})
   805  	s.BindHandler("/GetRequestWithDef", func(r *ghttp.Request) {
   806  		r.Response.Write(r.GetRequest("id", 2))
   807  	})
   808  	s.SetDumpRouterMap(false)
   809  	s.Start()
   810  	defer s.Shutdown()
   811  
   812  	time.Sleep(100 * time.Millisecond)
   813  	gtest.C(t, func(t *gtest.T) {
   814  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   815  		client := g.Client()
   816  		client.SetPrefix(prefix)
   817  
   818  		t.Assert(client.GetContent(ctx, "/GetRequestWithDef"), 2)
   819  
   820  		client.SetContentType("application/json")
   821  		t.Assert(client.GetContent(ctx, "/GetRequest", "id=1"), 1)
   822  	})
   823  }
   824  
   825  func Test_Params_GetRequestMapStrStr(t *testing.T) {
   826  	s := g.Server(guid.S())
   827  	s.BindHandler("/GetRequestMapStrStr", func(r *ghttp.Request) {
   828  		r.Response.Write(r.GetRequestMapStrStr())
   829  	})
   830  	s.SetDumpRouterMap(false)
   831  	s.Start()
   832  	defer s.Shutdown()
   833  
   834  	time.Sleep(100 * time.Millisecond)
   835  	gtest.C(t, func(t *gtest.T) {
   836  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   837  		client := g.Client()
   838  		client.SetPrefix(prefix)
   839  
   840  		t.Assert(client.GetContent(ctx, "/GetRequestMapStrStr"), "")
   841  	})
   842  }
   843  
   844  func Test_Params_GetRequestMapStrVar(t *testing.T) {
   845  	s := g.Server(guid.S())
   846  	s.BindHandler("/GetRequestMapStrVar", func(r *ghttp.Request) {
   847  		m := r.GetRequestMapStrVar()
   848  		r.Response.Write(m["id"])
   849  	})
   850  	s.SetDumpRouterMap(false)
   851  	s.Start()
   852  	defer s.Shutdown()
   853  
   854  	time.Sleep(100 * time.Millisecond)
   855  	gtest.C(t, func(t *gtest.T) {
   856  		prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
   857  		client := g.Client()
   858  		client.SetPrefix(prefix)
   859  
   860  		t.Assert(client.GetContent(ctx, "/GetRequestMapStrVar"), "")
   861  		t.Assert(client.GetContent(ctx, "/GetRequestMapStrVar", "id=1"), 1)
   862  	})
   863  }