首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析Go光纤/ fasthttp中任意参数数的POST请求体

如何解析Go光纤/ fasthttp中任意参数数的POST请求体
EN

Stack Overflow用户
提问于 2022-04-20 04:13:10
回答 2查看 1.3K关注 0票数 0
代码语言:javascript
复制
type Person struct {
    Name string `json:"name" xml:"name" form:"name"`
    Pass string `json:"pass" xml:"pass" form:"pass"`
}

app.Post("/", func(c *fiber.Ctx) error {
        p := new(Person)

        if err := c.BodyParser(p); err != nil {
            return err
        }

        log.Println(p.Name) // john
        log.Println(p.Pass) // doe

        // ...
})

上面是用结构解析POST请求的代码。在我的例子中,POST参数的数量可以是任意数字。在这种情况下如何分析呢?

EN

回答 2

Stack Overflow用户

发布于 2022-04-20 15:46:54

JSON (application/json)

多参数卷曲请求

代码语言:javascript
复制
curl -X POST -H "Content-Type: application/json" --data '[{"name":"john","pass":"doe"},{"name": "jack", "pass":"jill"}]' localhost:3000

代码:

代码语言:javascript
复制
package main

import (
  "log"

  "github.com/gofiber/fiber/v2"
)

type Person struct {
  Name string `json:"name" xml:"name" form:"name"`
  Pass string `json:"pass" xml:"pass" form:"pass"`
}

func main() {
  app := fiber.New()

  app.Post("/", func(c *fiber.Ctx) error {
    persons := []Person{}

    if err := c.BodyParser(&persons); err != nil {
      return err
    }

    log.Printf("%#v\n", persons)
    // []main.Person{main.Person{Name:"john", Pass:"doe"}, main.Person{Name:"jack", Pass:"jill"}}
    return c.SendString("Post Called")
  })

  app.Listen(":3000")
}

Form (application/x-www-form-urlencoded)

在研究了具有自定义表单数据处理实现的go-fiber源代码之后,目前似乎不支持定制类型的([]Person{})

有关更多信息,您可以检查这些指向处理数据的go-fiber源代码的链接:1 2 3.

相反,我们可以使用go-playground/form处理表单数据。

多参数卷曲请求

代码语言:javascript
复制
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" --data '[0].name=john&[0].pass=doe&[1].name=jack&[1].pass=jill' localhost:3000

代码:

代码语言:javascript
复制
package main

import (
  "log"

  "net/url"
  "github.com/gofiber/fiber/v2"
  "github.com/go-playground/form/v4"
)

type Person struct {
  Name string `json:"name" xml:"name" form:"name"`
  Pass string `json:"pass" xml:"pass" form:"pass"`
}

var decoder = form.NewDecoder()

func main() {
  app := fiber.New()

  app.Post("/", func(c *fiber.Ctx) error {
    persons := []Person{}

    m, err := url.ParseQuery(string(c.Body()))
    if err != nil {
      return err
    }
    err = decoder.Decode(&persons, m)
    if err != nil {
      return err
    }
    log.Printf("%#v\n", persons)
    // []main.Person{main.Person{Name:"john", Pass:"doe"}, main.Person{Name:"jack", Pass:"jill"}}
    return c.SendString("Post Called")
  })

  app.Listen(":3000")
}

我在issuePR中提出了一个go-fiber github存储库,它已经被合并了,所以下面的请求和代码现在可以工作了。

多参数卷曲请求

代码语言:javascript
复制
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" --data 'persons[0].name=one&persons[0].pass=1&persons[1].name=two&persons[1].pass=2' localhost:3000

代码:

代码语言:javascript
复制
package main

import (
    "log"

    "github.com/gofiber/fiber/v2"
)

// recommendation -> name of the api and parameters
type ApiParameters struct {
    Persons []Person `query:"persons" json:"persons" xml:"persons" form:"persons"`
}

type Person struct {
    Name string `query:"name" json:"name" xml:"name" form:"name"`
    Pass string `query:"pass" json:"pass" xml:"pass" form:"pass"`
}

func main() {
    app := fiber.New()

    app.Post("/", func(c *fiber.Ctx) error {
        parameters := ApiParameters{}

        if err := c.BodyParser(&parameters); err != nil {
            return err
        }

        log.Printf("POST: %#v\n", parameters)

        return c.SendString("Post Called")
    })

    log.Fatalln(app.Listen(":3000"))
}
票数 0
EN

Stack Overflow用户

发布于 2022-04-20 08:36:45

您可能会发现创建一个空映射是可行的,这段代码来自在这里输入链接描述,如下所示:(编辑以简化)

代码语言:javascript
复制
var x map[string]interface{}
json.Unmarshal([]byte(str), &x)
str2 := "{"foo":{"baz": [1,2,3]}}"
var y map[string]interface{}
json.Unmarshal([]byte(str2), &y)
fmt.Println("%v", y)

所以你会

代码语言:javascript
复制
err = c.BodyParser(str2)

在这个例子中。希望能帮上忙。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71934014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档