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"
  // ...
})