JSON/XML解析

GF v1.11版本开始,Request对象提供了对客户端提交的JSON/XML数据格式的原生支持,为开发者提供了更便捷的数据获取特性,以进一步提高开发效率。

示例1,简单示例

  1. package main
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/net/ghttp"
  5. )
  6. func main() {
  7. s := g.Server()
  8. s.BindHandler("/", func(r *ghttp.Request) {
  9. r.Response.Writef("name: %v, pass: %v", r.Get("name"), r.Get("pass"))
  10. })
  11. s.SetPort(8199)
  12. s.Run()
  13. }

执行后,我们通过curl工具提交数据来测试一下:

  1. Query数据格式

    1. $ curl "http://127.0.0.1:8199/?name=john&pass=123"
    2. name: john, pass: 123
  2. Form表单提交

    1. $ curl -d "name=john&pass=123" "http://127.0.0.1:8199/"
    2. name: john, pass: 123
  3. JSON数据格式

    1. $ curl -d '{"name":"john","pass":"123"}' "http://127.0.0.1:8199/"
    2. name: john, pass: 123
  4. XML数据格式

    1. $ curl -d '<?xml version="1.0" encoding="UTF-8"?><doc><name>john</name><pass>123</pass></doc>' "http://127.0.0.1:8199/"
    2. name: john, pass: 123
    3. $ curl -d '<doc><name>john</name><pass>123</pass></doc>' "http://127.0.0.1:8199/"
    4. name: john, pass: 123

示例2,对象转换及校验

  1. package main
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/net/ghttp"
  5. "github.com/gogf/gf/util/gvalid"
  6. )
  7. type RegisterReq struct {
  8. Name string `p:"username" v:"required|length:6,30#请输入账号|账号长度为:min到:max位"`
  9. Pass string `p:"password1" v:"required|length:6,30#请输入密码|密码长度不够"`
  10. Pass2 string `p:"password2" v:"required|length:6,30|same:password1#请确认密码|密码长度不够|两次密码不一致"`
  11. }
  12. type RegisterRes struct {
  13. Code int `json:"code"`
  14. Error string `json:"error"`
  15. Data interface{} `json:"data"`
  16. }
  17. func main() {
  18. s := g.Server()
  19. s.BindHandler("/register", func(r *ghttp.Request) {
  20. var req *RegisterReq
  21. if err := r.Parse(&req); err != nil {
  22. // Validation error.
  23. if v, ok := err.(*gvalid.Error); ok {
  24. r.Response.WriteJsonExit(RegisterRes{
  25. Code: 1,
  26. Error: v.FirstString(),
  27. })
  28. }
  29. // Other error.
  30. r.Response.WriteJsonExit(RegisterRes{
  31. Code: 1,
  32. Error: err.Error(),
  33. })
  34. }
  35. // ...
  36. r.Response.WriteJsonExit(RegisterRes{
  37. Data: req,
  38. })
  39. })
  40. s.SetPort(8199)
  41. s.Run()
  42. }

执行后,我们通过curl工具提交数据来测试一下:

  1. JSON数据格式

    1. $ curl -d '{"username":"johngcn","password1":"123456","password2":"123456"}' "http://127.0.0.1:8199/register"
    2. {"code":0,"error":"","data":{"Name":"johngcn","Pass":"123456","Pass2":"123456"}}
    3. $ curl -d '{"username":"johngcn","password1":"123456","password2":"123"}' "http://127.0.0.1:8199/register"
    4. {"code":1,"error":"两次密码不一致","data":null}

    可以看到,我们提交的JSON内容也被Parse方法智能地转换为了结构体对象。

  2. XML数据格式

    1. $ curl -d '<?xml version="1.0" encoding="UTF-8"?><doc><username>johngcn</username><password1>123456</password1><password2>123456</password2></doc>' "http://127.0.0.1:8199/register"
    2. {"code":0,"error":"","data":{"Name":"johngcn","Pass":"123456","Pass2":"123456"}}
    3. $ curl -d '<?xml version="1.0" encoding="UTF-8"?><doc><username>johngcn</username><password1>123456</password1><password2>123</password2></doc>' "http://127.0.0.1:8199/register"
    4. {"code":1,"error":"两次密码不一致","data":null}

    可以看到,我们提交的XML内容也被Parse方法智能地转换为了结构体对象。