Gestione dei vari parametri della richiesta nel framework Go Fiber
Esempio Semplice
Tutti i parametri della richiesta nel framework Fiber vengono ottenuti attraverso l'oggetto di contesto Ctx
.
app.Get("/user/:name?", func(c *fiber.Ctx) error {
// Ottenere i parametri attraverso il parametro Ctx della funzione del percorso e chiamare il metodo appropriato
// Qui, il parametro name viene ottenuto tramite Params
return c.SendString(c.Params("name"))
})
Ottenimento dei Parametri del Percorso
Ottenimento dei parametri dal percorso dell'URL
// GET http://example.com/user/fenny
app.Get("/user/:name", func(c *fiber.Ctx) error {
c.Params("name") // "fenny"
// ...
})
// GET http://example.com/user/fenny/123
app.Get("/user/*", func(c *fiber.Ctx) error {
c.Params("*") // "fenny/123"
c.Params("*1") // "fenny/123"
c.Params("*", "valore predefinito") // È possibile impostare un valore predefinito con il secondo parametro
})
Ottenimento dei parametri del tipo Int del percorso
// GET http://example.com/user/123
app.Get("/user/:id", func(c *fiber.Ctx) error {
id, err := c.ParamsInt("id") // int 123 e nessun errore
// ...
})
Ottenimento dei Parametri della Query della Richiesta GET
// GET http://example.com/?order=desc&brand=nike
app.Get("/", func(c *fiber.Ctx) error {
c.Query("order") // "desc"
c.Query("brand") // "nike"
// È possibile utilizzare il secondo parametro per impostare un valore predefinito, che sarà restituito se il parametro non esiste
c.Query("empty", "nike") // "nike"
// ...
})
Restituzione di tutti i parametri della query
// GET http://example.com/?name=alex&want_pizza=false&id=
app.Get("/", func(c *fiber.Ctx) error {
m := c.Queries()
m["name"] // "alex"
m["want_pizza"] // "false"
m["id"] // ""
// ...
})
Vincolare i parametri della query a un oggetto struttura
// Definire una struttura per ricevere i parametri
// Utilizzare il tag della query per specificare i nomi dei parametri da vincolare
type Person struct {
Name string `query:"name"`
Pass string `query:"pass"`
Products []string `query:"products"`
}
app.Get("/", func(c *fiber.Ctx) error {
// Definire una variabile struttura per ricevere i parametri
p := new(Person)
// Utilizzare QueryParser per vincolare i parametri della query alla variabile p
if err := c.QueryParser(p); err != nil {
return err
}
log.Println(p.Name) // john
log.Println(p.Pass) // doe
log.Println(p.Products) // [shoe, hat]
// ...
})
// Eseguire il seguente comando curl per testare
// curl "http://localhost:3000/?name=john&pass=doe&products=shoe,hat"
Ottenimento dei Parametri della Form della Richiesta POST
app.Post("/", func(c *fiber.Ctx) error {
// Ottenere il primo valore dal campo del modulo "name":
c.FormValue("name")
// => "john" o "" se non esiste
// ...
})
## Gestione dei parametri del corpo
Viene principalmente utilizzato per elaborare richieste POST/PUT e supporta parametri JSON, XML e modulo.
```go
// Definire la struttura per ricevere i parametri e definire i nomi dei campi dei parametri che si desidera ricevere tramite i tag json, xml e form
// json, xml, form possono essere selezionati a seconda delle esigenze; non è necessario includerli tutti
type Persona struct {
Nome string `json:"nome" xml:"nome" form:"nome"`
Pass string `json:"pass" xml:"pass" form:"pass"`
}
app.Post("/", func(c *fiber.Ctx) error {
// Definire la variabile di tipo struct per ricevere i parametri
p := new(Persona)
// Utilizzare BodyParser per associare i parametri del corpo alla variabile p
if err := c.BodyParser(p); err != nil {
return err
}
log.Println(p.Nome) // john
log.Println(p.Pass) // doe
// ...
})
// Esempi di vari tipi di richieste; per le richieste di parametri in formato JSON, ricordarsi di impostare Content-Type: application/json
// curl -X POST -H "Content-Type: application/json" --data "{\"nome\":\"john\",\"pass\":\"doe\"}" localhost:3000
// curl -X POST -H "Content-Type: application/xml" --data "<login><nome>john</nome><pass>doe</pass></login>" localhost:3000
// curl -X POST -H "Content-Type: application/x-www-form-urlencoded" --data "nome=john&pass=doe" localhost:3000
// curl -X POST -F nome=john -F pass=doe http://localhost:3000
// curl -X POST "http://localhost:3000/?nome=john&pass=doe"
Come recuperare i dati del corpo originale:
// curl -X POST http://localhost:8080 -d user=john
app.Post("/", func(c *fiber.Ctx) error {
// Utilizzare BodyRaw per restituire i dati del corpo grezzi
return c.Send(c.BodyRaw()) // []byte("user=john")
})
Recupero dei parametri dell'intestazione della richiesta
app.Get("/", func(c *fiber.Ctx) error {
c.Get("Content-Type") // "text/plain"
c.Get("CoNtEnT-TypE") // "text/plain"
c.Get("qualcosa", "john") // "john"
// ...
})
Recupero dell'indirizzo IP del client
app.Get("/", func(c *fiber.Ctx) error {
c.IP() // "127.0.0.1"
// ...
})
Se sei deployato su un server che utilizza un proxy o un bilanciatore di carico, è necessario recuperare l'IP del client attraverso l'intestazione x-forwarded-for impostando come segue:
app := fiber.New(fiber.Config{
ProxyHeader: fiber.HeaderXForwardedFor,
})
Lettura dei cookie
app.Get("/", func(c *fiber.Ctx) error {
// Ottenere il cookie per chiave:
c.Cookies("nome") // "john"
c.Cookies("vuoto", "doe") // "doe"
// ...
})