Obsługa różnych parametrów żądania w frameworku Go Fiber

Prosty przykład

Wszystkie parametry żądania w frameworku Fiber są pobierane za pomocą obiektu kontekstu Ctx.

app.Get("/użytkownik/:nazwa?", func(c *fiber.Ctx) error {
    // Pobierz parametry za pomocą parametru Ctx funkcji trasy i wywołaj odpowiednią metodę
    // Tutaj parametr nazwa jest pobierany za pomocą Params
    return c.SendString(c.Params("nazwa"))
})

Pobieranie parametrów trasy

Pobieranie parametrów z ścieżki URL

// GET http://example.com/użytkownik/fenny
app.Get("/użytkownik/:nazwa", func(c *fiber.Ctx) error {
  c.Params("nazwa") // "fenny"

  // ...
})

// GET http://example.com/użytkownik/fenny/123
app.Get("/użytkownik/*", func(c *fiber.Ctx) error {
  c.Params("*")  // "fenny/123"
  c.Params("*1") // "fenny/123"
  
  c.Params("*", "wartość domyślna")  // Wartość domyślna może być ustawiona za pomocą drugiego parametru
})

Pobieranie parametrów trasy typu Int

// GET http://example.com/użytkownik/123
app.Get("/użytkownik/:id", func(c *fiber.Ctx) error {
  id, err := c.ParamsInt("id") // int 123 i brak błędu

  // ...
})

Pobieranie parametrów zapytania GET

// GET http://example.com/?order=desc&brand=nike
app.Get("/", func(c *fiber.Ctx) error {
  c.Query("order")         // "desc"
  c.Query("brand")         // "nike"
  // Drugi parametr może być użyty do ustawienia wartości domyślnej, która zostanie zwrócona, jeśli parametr nie istnieje
  c.Query("puste", "nike") // "nike"

  // ...
})

Zwracanie wszystkich parametrów zapytania

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

Wiązanie parametrów zapytania do obiektu struktury

// Zdefiniuj strukturę do odbierania parametrów
// Użyj tagu query, aby określić nazwy parametrów do zbindowania
type Osoba struct {
    Nazwa     string     `query:"nazwa"`
    Hasło     string     `query:"hasło"`
    Produkty []string   `query:"produkty"`
}

app.Get("/", func(c *fiber.Ctx) error {
        // Zdefiniuj zmienną struktury do odbierania parametrów
        p := new(Osoba)

        // Użyj QueryParser do związania parametrów zapytania z zmienną p
        if err := c.QueryParser(p); err != nil {
            return err
        }

        log.Println(p.Nazwa)     // john
        log.Println(p.Hasło)     // doe
        log.Println(p.Produkty) // [but, czapka]

        // ...
})
// Wykonaj poniższą komendę curl, aby przetestować
// curl "http://localhost:3000/?nazwa=john&hasło=doe&produkty=but,czapka"

Pobieranie parametrów formularza żądania POST

app.Post("/", func(c *fiber.Ctx) error {
  // Pobierz pierwszą wartość z pola formularza "nazwa":
  c.FormValue("nazwa")
  // => "john" lub "" jeśli nie istnieje

  // ...
})
## Obsługa parametrów ciała żądania


Głównie służy do przetwarzania żądań POST/PUT oraz obsługuje parametry w formacie JSON, XML i formularza.

```go
// Definiuje strukturę do odbierania parametrów oraz definiuje nazwy pól parametrów, które chcesz otrzymać za pomocą tagów json, xml i form
// json, xml, form mogą być wybrane według potrzeb; nie jest konieczne zawieranie ich wszystkich
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 {
    // Definiuje zmienną typu struct do odbierania parametrów
    p := new(Person)

    // Używa BodyParser do powiązania parametrów ciała zmienną p
    if err := c.BodyParser(p); err != nil {
        return err
    }

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

    // ...
})

// Przykłady różnych typów żądań; dla żądań parametrów w formacie JSON, pamiętaj, aby ustawić Content-Type: application/json

// curl -X POST -H "Content-Type: application/json" --data "{\"name\":\"john\",\"pass\":\"doe\"}" localhost:3000

// curl -X POST -H "Content-Type: application/xml" --data "<login><name>john</name><pass>doe</pass></login>" localhost:3000

// curl -X POST -H "Content-Type: application/x-www-form-urlencoded" --data "name=john&pass=doe" localhost:3000

// curl -X POST -F name=john -F pass=doe http://localhost:3000

// curl -X POST "http://localhost:3000/?name=john&pass=doe"

Jak pobrać oryginalne dane ciała żądania, przedstawiono poniżej:

// curl -X POST http://localhost:8080 -d user=john

app.Post("/", func(c *fiber.Ctx) error {
  // Użyj BodyRaw do zwrócenia surowych danych ciała
  return c.Send(c.BodyRaw()) // []byte("user=john")
})

Odbieranie nagłówków żądania

app.Get("/", func(c *fiber.Ctx) error {
  c.Get("Content-Type")       // "text/plain"
  c.Get("CoNtEnT-TypE")       // "text/plain"
  c.Get("something", "john")  // "john"
  // ...
})

Pobieranie adresu IP klienta

app.Get("/", func(c *fiber.Ctx) error {
  c.IP() // "127.0.0.1"

  // ...
})

Jeśli jesteś wdrożony na serwerze przy użyciu proxy lub równoważnika obciążenia, musisz pobrać adres IP klienta poprzez nagłówek x-forwarded-for, ustawiając to następująco:

app := fiber.New(fiber.Config{
  ProxyHeader: fiber.HeaderXForwardedFor,
})

Odczytanie ciasteczek

app.Get("/", func(c *fiber.Ctx) error {
  // Pobierz ciasteczko po kluczu:
  c.Cookies("name")         // "john"
  c.Cookies("empty", "doe") // "doe"
  // ...
})