iris前置自定义读取请求(不需要自己实现实现Decode接口)

目录结构

主目录readCustomViaUnmarshaler

  1. —— main.go
  2. —— main_test.go

代码示例

main.go

  1. package main
  2. import (
  3. "gopkg.in/yaml.v2"
  4. "github.com/kataras/iris"
  5. )
  6. func main() {
  7. app := newApp()
  8. //使用Postman或其他什么来做POST请求
  9. //(但是你总是可以自由地使用app.Get和GET http方法请求来读取请求值)
  10. //使用RAW BODY到http//localhost:8080:
  11. /*
  12. addr: localhost:8080
  13. serverName: Iris
  14. */
  15. //响应应该是:
  16. //收到: main.config{Addr:"localhost:8080", ServerName:"Iris"}
  17. app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed), iris.WithOptimizations)
  18. }
  19. func newApp() *iris.Application {
  20. app := iris.New()
  21. app.Post("/", handler)
  22. return app
  23. }
  24. //简单的yaml内容,请访问https://github.com/go-yaml/yaml阅读更多内容
  25. type config struct {
  26. Addr string `yaml:"addr"`
  27. ServerName string `yaml:"serverName"`
  28. }
  29. /*
  30. type myBodyDecoder struct{}
  31. var DefaultBodyDecoder = myBodyDecoder{}
  32. //在我们的例子中实现`kataras/iris/context#Unmarshaler`
  33. //我们将使用最简单的`context#UnmarshalerFunc`来传递yaml.Unmarshal。
  34. //可以用作:ctx.UnmarshalBody(&c.DefaultBodyDecoder)
  35. func (r *myBodyDecoder) Unmarshal(data []byte, outPtr interface{}) error {
  36. return yaml.Unmarshal(data, outPtr)
  37. }
  38. */
  39. func handler(ctx iris.Context) {
  40. var c config
  41. // 注意:yaml.Unmarshal已经实现了`context#Unmarshaler`
  42. //所以我们可以直接使用它,比如json.Unmarshal(ctx.ReadJSON),xml.Unmarshal(ctx.ReadXML)
  43. //以及遵循最佳实践并符合Go标准的每个库。
  44. //注意2:如果你因任何原因需要多次读取访问body
  45. //你应该通过`app.Run(...,iris.WithoutBodyConsumptionOnUnmarshal)消费body
  46. if err := ctx.UnmarshalBody(&c, iris.UnmarshalerFunc(yaml.Unmarshal)); err != nil {
  47. ctx.StatusCode(iris.StatusBadRequest)
  48. ctx.WriteString(err.Error())
  49. return
  50. }
  51. ctx.Writef("Received: %#+v", c)
  52. }

main_test.go

  1. package main
  2. import (
  3. "testing"
  4. "github.com/kataras/iris/httptest"
  5. )
  6. func TestReadCustomViaUnmarshaler(t *testing.T) {
  7. app := newApp()
  8. e := httptest.New(t, app)
  9. expectedResponse := `Received: main.config{Addr:"localhost:8080", ServerName:"Iris"}`
  10. e.POST("/").WithText("addr: localhost:8080\nserverName: Iris").Expect().
  11. Status(httptest.StatusOK).Body().Equal(expectedResponse)
  12. }