Gin: bagaimana cara mengikat string kueri?

Dibuat pada 16 Nov 2016  ·  19Komentar  ·  Sumber: gin-gonic/gin

package main

import "log"
import "github.com/gin-gonic/gin"

type Person struct {
    Name    string `json:"name"`
    Address string `json:"address"`
}

func main() {
    log.Println("Hello World")
    route := gin.Default()
    route.GET("/testing", startPage)
    route.Run(":8085")
}

func startPage(c *gin.Context) {
    var person Person
    if c.BindJSON(&person) == nil {
        log.Println(person.Name)
        log.Println(person.Address)
        log.Println("Binding success...............")
    } else {
        log.Println("Binding failed...............")
    }

    c.String(200, "Success")
}

Kode di atas hanya berfungsi untuk curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json" tetapi tidak untuk curl -X GET localhost:8085/testing?name=JJ&address=xyz -H "Content-Type:application/json"

jika saya menggunakan c.Bind(&person) , pengikatan gagal pada kedua kasus.
Bagaimana saya bisa menulis kode di atas yang mengikat string kueri dan json.

enhancement help wanted question

Komentar yang paling membantu

Contoh berikut berhasil untuk saya.

package main

import "log"
import "github.com/gin-gonic/gin"

type Person struct {
    Name    string `form:"name" json:"name"`
    Address string `form:"address" json:"address"`
}

func main() {
    route := gin.Default()
    route.GET("/testing", startPage)
    route.Run(":8085")
}

func startPage(c *gin.Context) {
    var person Person
    if c.Bind(&person) == nil {
        log.Println("====== Bind By Query String ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

    if c.BindJSON(&person) == nil {
        log.Println("====== Bind By JSON ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

    c.String(200, "Success")
}

Dan coba perintah berikut:

# bind by query
$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz"
# bind by json
$ curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"

screen shot 2016-12-04 at 10 56 58 am

Anda dapat menemukan contohnya dari URL berikut:

https://github.com/gin-gonic/gin#model -binding-and-validation

Mungkin kita perlu menambahkan contoh permintaan bind pada dokumen. 😄

Semua 19 komentar

1 untuk c. BindQuery

Kami tidak membutuhkan c.BindQuery .

Coba c.Bind untuk string kueri dan data kiriman:

type Person struct {
    Name    string `form:"name"`
    Address string `form:"address"`
}

Coba c.BindJSON untuk data JSON:

type Person struct {
    Name    string `json:"name"`
    Address string `json:"address"`
}

Melihat ke kode binding, saya tidak melihat di mana pun ia mengakses req.URL.Query (). Saya tidak mengerti bagaimana kita dapat mengikat parameter kueri tanpa itu.

@jasonab menggunakan http.Request.Form, yang berisi parameter kueri.

@appleboy terima kasih! Ini sama sekali tidak jelas dari dokumen. :-(

@ ei-grad Terima kasih, itu tidak jelas :-)

Contoh berikut berhasil untuk saya.

package main

import "log"
import "github.com/gin-gonic/gin"

type Person struct {
    Name    string `form:"name" json:"name"`
    Address string `form:"address" json:"address"`
}

func main() {
    route := gin.Default()
    route.GET("/testing", startPage)
    route.Run(":8085")
}

func startPage(c *gin.Context) {
    var person Person
    if c.Bind(&person) == nil {
        log.Println("====== Bind By Query String ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

    if c.BindJSON(&person) == nil {
        log.Println("====== Bind By JSON ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

    c.String(200, "Success")
}

Dan coba perintah berikut:

# bind by query
$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz"
# bind by json
$ curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"

screen shot 2016-12-04 at 10 56 58 am

Anda dapat menemukan contohnya dari URL berikut:

https://github.com/gin-gonic/gin#model -binding-and-validation

Mungkin kita perlu menambahkan contoh permintaan bind pada dokumen. 😄

@jasonab @ ei-grad Saya akan memperbarui dokumen secepatnya.

Mungkin kita perlu menambahkan contoh permintaan bind pada dokumen. 😄

Itu akan sangat bagus.

Bagaimana jika Anda memposting nilai dan memiliki parameter string kueri, bagaimana Anda hanya mengurai / mengikat parameter string kueri.

Bind selalu menggunakan r.Form yang merupakan kombinasi dari nilai yang diposting dan parameter kueri ... hal yang sama berlaku untuk hanya ingin mengurai / mengikat r.PostForm dan tidak menginginkan string kueri.

1 untuk BindQuery

Saya membuat PR baru untuk memperbaiki dokumen. https://github.com/gin-gonic/gin/pull/772

Jadi @appleboy jika Anda memposting data dan memiliki parameter Query string bagaimana Anda HANYA mengikat parameter Query string atau HANYA mengikat data yang diposting?

Sepertinya komentar saya sebelumnya baru saja diabaikan.

https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292

Apakah Anda melihat tangkapan layar?

hanya mengikat kueri atau data posting

    if c.Bind(&person) == nil {
        log.Println("====== Bind By Query String ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

hanya mengikat data json

    if c.BindJSON(&person) == nil {
        log.Println("====== Bind By JSON ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

Ya @appleboy Saya memang melihat tangkapan

Contoh Anda adalah untuk Query params dan JSON dan contoh saya adalah posting Form Data dan Query params.

Bagaimana jika seseorang ingin HANYA mengikat Parameter Kueri dan bukan data formulir.

itulah intinya! Saya pikir kita membutuhkan fungsi BindQuery yang hanya mengikat parameter kueri dan bukan data posting jika seseorang menggunakan keduanya bersama-sama

Hanya Bind Query String

Lihat PR https://github.com/gin-gonic/gin/pull/1029. Tambahkan c.BindQuery fungsi yang hanya mengikat parameter kueri dan bukan data kiriman.

package main

import "log"
import "github.com/gin-gonic/gin"

type Person struct {
    Name    string `form:"name"`
    Address string `form:"address"`
}

func main() {
    route := gin.Default()
    route.Any("/testing", startPage)
    route.Run(":8085")
}

func startPage(c *gin.Context) {
    var person Person
    if c.BindQuery(&person) == nil {
        log.Println("====== Only Bind Query String ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }
    c.String(200, "Success")
}

Coba perintah berikut:

# only bind query
$ curl -X GET "localhost:8085/testing?name=eason&address=xyz"

# only bind query string, ignore form data
$ curl -X POST "localhost:8085/testing?name=eason&address=xyz" --data 'name=ignore&address=ignore' -H "Content-Type:application/x-www-form-urlencoded"

Akan Mengeluarkan:
2017-07-18 12 09 57

1029 digabung

Kami tidak membutuhkan c.BindQuery .

Coba c.Bind untuk string kueri dan data kiriman:

type Person struct {
  Name    string `form:"name"`
  Address string `form:"address"`
}

Coba c.BindJSON untuk data JSON:

type Person struct {
  Name    string `json:"name"`
  Address string `json:"address"`
}

bindQuery juga bekerja dengan tag "form"

Apakah halaman ini membantu?
0 / 5 - 0 peringkat