Trasportowanie
Rola trasy w frameworku Go Fiber polega na wiązaniu różnych adresów URL z funkcjami obsługi, aby obsługiwać przetwarzanie żądań HTTP. Stanowi ona punkt wejścia dla wszystkich żądań frameworka internetowego.
Obsługa Trasportowania (Funkcje)
Rejestruje trasy, które są przypisane do określonych metod HTTP.
Uwaga: W niektórych frameworkach obsługa tras może być nazywana kontrolerami, co zazwyczaj ma tę samą definicję — wskazuje, która funkcja (metoda) ma obsłużyć przychodzące żądanie HTTP.
Sygnatura funkcji:
// Metody HTTP
func (app *App) Get(path string, handlers ...Handler) Router
func (app *App) Head(path string, handlers ...Handler) Router
func (app *App) Post(path string, handlers ...Handler) Router
func (app *App) Put(path string, handlers ...Handler) Router
func (app *App) Delete(path string, handlers ...Handler) Router
func (app *App) Connect(path string, handlers ...Handler) Router
func (app *App) Options(path string, handlers ...Handler) Router
func (app *App) Trace(path string, handlers ...Handler) Router
func (app *App) Patch(path string, handlers ...Handler) Router
// Metoda Add pozwala określić metody jako wartości
func (app *App) Add(method, path string, handlers ...Handler) Router
// All rejestruje trasę na wszystkich metodach HTTP
// Podobne do app.Use, ale nie wiąże prefiksu
func (app *App) All(path string, handlers ...Handler) Router
Przykład:
// Prosta obsługa GET
app.Get("/api/list", func(c *fiber.Ctx) error {
return c.SendString("To jest żądanie typu GET!")
})
// Prosta obsługa POST
app.Post("/api/register", func(c *fiber.Ctx) error {
return c.SendString("To jest żądanie typu POST!")
})
Use służy do ładowania oprogramowania pośredniczącego oraz przechwytywania prefiksów URL. Te trasy pasują tylko do początku każdej ścieżki, na przykład, /john
pasuje do /john/doe
, /johnnnnn
itp.
Sygnatura niestandardowej funkcji pośredniczącej:
func (app *App) Use(args ...interface{}) Router
Przykład:
// Pasuje do każdego żądania
app.Use(func(c *fiber.Ctx) error {
return c.Next()
})
// Pasuje do żądań zaczynających się od /api
app.Use("/api", func(c *fiber.Ctx) error {
return c.Next()
})
// Pasuje do żądań zaczynających się od /api lub /home (obsługuje wiele prefiksów)
app.Use([]string{"/api", "/home"}, func(c *fiber.Ctx) error {
return c.Next()
})
// Dodaje wiele obsługujących
app.Use("/api", func(c *fiber.Ctx) error {
c.Set("X-Custom-Header", random.String(32))
return c.Next()
}, func(c *fiber.Ctx) error {
return c.Next()
})
Ścieżka
Ścieżka trasy razem z metodą żądania definiuje punkty końcowe, do których można uzyskać dostęp. Ścieżka trasy może być łańcuchem znaków lub wzorcem łańcucha znaków.
Przykłady ścieżek opartych na łańcuchach znaków
// Ta ścieżka trasy będzie pasować do żądań ścieżki głównej, "/":
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Ścieżka główna")
})
// Ta ścieżka trasy będzie pasować do żądań "/about":
app.Get("/about", func(c *fiber.Ctx) error {
return c.SendString("Informacje")
})
// Ta ścieżka trasy będzie pasować do żądań "/random.txt":
app.Get("/random.txt", func(c *fiber.Ctx) error {
return c.SendString("Losowy.txt")
Podobnie jak w frameworku expressJs, istotna jest kolejność deklarowania tras. Po otrzymaniu żądania trasy są sprawdzane w kolejności ich deklaracji.
Proszę zauważyć: Upewnij się, że trasy z parametrami zmiennymi są zapisane po trasach zawierających stałe części, aby zapobiec ich błędnemu dopasowaniu, co mogłoby prowadzić do nieoczekiwanego zachowania.
Parametry trasy
Parametry trasy są dynamicznymi elementami trasy i mogą być albo nazwanymi, albo nienazwanymi segmentami. Te segmenty służą do przechwytywania wartości na określonych pozycjach w adresie URL. Można użyć funkcji Params do pobrania tych wartości, gdzie parametrem funkcji jest nazwa parametru trasy w ścieżce, lub dla parametrów nienazwanych, są to znaki (*, +) i ich liczba.
Znak wieloznaczny (*) lub plus (+) reprezentuje parametry zachłanne.
Trasy pozwalają również na używanie parametrów opcjonalnych. Dla nazwanych parametrów, parametry te poprzedza znak zapytania (?), podczas gdy plus nie jest opcjonalny, a można użyć znaków wieloznacznych do reprezentowania opcjonalnego i zachłannego zakresu.
Przykład definiowania trasy z parametrami trasy
// Parametry
app.Get("/user/:name/books/:title", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s\n", c.Params("name"))
fmt.Fprintf(c, "%s\n", c.Params("title"))
return nil
})
// Plus - zachłanny - nieopcjonalny
app.Get("/user/+", func(c *fiber.Ctx) error {
return c.SendString(c.Params("+"))
})
// Parametr opcjonalny
app.Get("/user/:name?", func(c *fiber.Ctx) error {
return c.SendString(c.Params("name"))
})
// Znak wieloznaczny - zachłanny - opcjonalny
app.Get("/user/*", func(c *fiber.Ctx) error {
return c.SendString(c.Params("*"))
})
// Ta ścieżka trasy będzie pasować do żądania "/v1/some/resource/name:customVerb" ponieważ znaki parametrów zostały zescapowane
app.Get(`/v1/some/resource/name\:customVerb`, func(c *fiber.Ctx) error {
return c.SendString("Witaj, Społeczność")
})
Ponieważ myślniki (-) i kropki (.) są interpretowane dosłownie, mogą być używane wraz z parametrami trasy w celu osiągnięcia celów użytkowych.
Wszystkie specjalne znaki parametrów mogą być również zescapowane za pomocą
\
, a ich wartości będą ignorowane, więc jeśli chcesz ich użyć w trasie. Zaleca się używanie odwrotnych apostrofów ``, ponieważ w dokumentacji dotyczącej wyrażeń regularnych w Go zawsze są one stosowane, aby upewnić się, że nie ma niejednoznaczności i znaki escape nie wpłyną przypadkowo na wzorzec wyrażenia regularnego.
// http://localhost:3000/plantae/prunus.persica
app.Get("/plantae/:genus.:species", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s.%s\n", c.Params("genus"), c.Params("species"))
return nil // prunus.persica
})
// http://localhost:3000/flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s-%s\n", c.Params("from"), c.Params("to"))
return nil // LAX-SFO
})
Nasza inteligentna trasowanie rozpoznaje, że wprowadzone znaki parametrów w tym przypadku powinny być częścią trasy żądania i może nimi zarządzać jako takimi.
// http://localhost:3000/shop/product/color:blue/size:xs
app.Get("/shop/product/color::color/size::size", func(c *fiber.Ctx) error {
fmt.Fprintf(c, "%s:%s\n", c.Params("color"), c.Params("size"))
return nil // blue:xs
})
Ponadto, trasy mogą wykorzystywać wiele parametrów i wiele znaków parametrów nienazwanych kolejno, takich jak znaki wieloznaczne lub plus, co znacznie poszerza możliwości użytkowników w trasach.
// GET /@v1
// Params: "sign" -> "@", "param" -> "v1"
app.Get("/:sign:param", handler)
// GET /api-v1
// Params: "name" -> "v1"
app.Get("/api-:name", handler)
// GET /customer/v1/cart/proxy
// Params: "*1" -> "customer/", "*2" -> "/cart"
app.Get("/*v1*/proxy", handler)
// GET /v1/brand/4/shop/blue/xs
// Params: "*1" -> "brand/4", "*2" -> "blue/xs"
app.Get("/v1/*/shop/*", handler)
Już dostosowaliśmy trasowanie do trasowania Express, ale nie obsługuje ono jeszcze wyrażeń regularnych, ponieważ są one stosunkowo wolne.
Ograniczenia
W przypadku dopasowania przychodzącego adresu URL oraz podziału ścieżki URL na wartości trasowe za pomocą parametrów, zostaną wykonane ograniczenia. Ta funkcja została wprowadzona w wersji v2.37.0
i została zainspirowana przez .NET Core.
Ograniczenia nie służą do walidacji parametrów. Jeśli ograniczenie jest nieprawidłowe dla wartości parametru, Fiber zwróci obróbkę 404.
Ograniczenie | Przykład | Przykładowe dopasowania |
---|---|---|
int | :id |
123456789, -123456789 |
bool | :active |
true, false |
guid | :id |
CD2C1638-1638-72D5-1638-DEADBEEF1638 |
float | :weight |
1.234, -1,001.01e8 |
minLen(value) | :username<minLen(4)> | test (co najmniej 4 znaki) |
maxLen(value) | :filename<maxLen(8)> | MyFile (maksymalnie 8 znaków) |
len(length) | :filename<len(12)> | somefile.txt (12 znaków) |
min(value) | :age<min(18)> | 19 (wartość całkowita musi być co najmniej 18) |
max(value) | :age<max(120)> | 91 (wartość całkowita nie może przekroczyć 120) |
range(min,max) | :age<range(18,120)> | 91 (wartość całkowita musi być co najmniej 18, ale nie może przekroczyć 120) |
alpha | :name |
Rick (ciąg musi składać się z jednego lub więcej znaków alfabetu, wielkość liter nie ma znaczenia, a-z) |
datetime | :dob<datetime(2006\\-01\\-02)> | 2005-11-01 |
regex(expression) | :date<regex(\d{4}-\d{2}-\d{2})> | 2022-08-27 (musi pasować do wyrażenia regularnego) |
Przykłady
- Jedno Ograniczenie
- Wiele Ograniczeń
- Ograniczenie Wyrażenia Regularnego
app.Get("/:test", func(c *fiber.Ctx) error {
return c.SendString(c.Params("test"))
})
// curl -X GET http://localhost:3000/12 // 12
// curl -X GET http://localhost:3000/1 // Nie znaleziono GET /1
Możesz użyć `;` aby dodać wiele ograniczeń.
app.Get("/:test", func(c *fiber.Ctx) error { return c.SendString(c.Params("test")) })
// curl -X GET http://localhost:3000/120000 // Nie znaleziono GET /120000
// curl -X GET http://localhost:3000/1 // Nie znaleziono GET /1
// curl -X GET http://localhost:3000/250 // 250
Fiber prekompiluje zapytania wyrażeń regularnych podczas rejestracji tras, dlatego nie ma dodatkowego obciążenia wydajnościowego dla ograniczeń wyrażeń regularnych.
```go
app.Get(`/:date`, func(c *fiber.Ctx) error {
return c.SendString(c.Params("date"))
})
// curl -X GET http://localhost:3000/125 // Nie znaleziono GET /125
// curl -X GET http://localhost:3000/test // Nie znaleziono GET /test
// curl -X GET http://localhost:3000/2022-08-27 // 2022-08-27
> Podczas korzystania z ograniczeń daty i czasu (`*`,`+`,`?`,`:`,`/`,``,``,`>`,';`,`(`,`)`), użyj `\\` przed użyciem znaków specjalnych w trasie, aby uniknąć błędnego interpretowania.
**Przykład Parametru Opcjonalnego**
Można także dodać ograniczenia do parametrów opcjonalnych.
```go
app.Get("/:test?", func(c *fiber.Ctx) error {
return c.SendString(c.Params("test"))
})
// curl -X GET http://localhost:3000/42
// 42
// curl -X GET http://localhost:3000/
//
// curl -X GET http://localhost:3000/7.0
// Nie znaleziono GET /7.0
Oprogramowanie pośredniczące
Funkcje przeznaczone do manipulacji żądań lub odpowiedzi nazywane są funkcjami pośredniczącymi. Next
jest funkcją routingu Fibera, która, gdy zostanie wywołana, wykonuje funkcję next
, która pasuje do bieżącej trasy.
Przykład funkcji pośredniczącej
app.Use(func(c *fiber.Ctx) error {
// Ustaw niestandardowy nagłówek we wszystkich odpowiedziach:
c.Set("X-Custom-Header", "Witaj, świecie")
// Przejdź do następnego oprogramowania pośredniczącego:
return c.Next()
})
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Witaj, świecie!")
})
Ścieżka dla metody Use
może być ścieżką montażową lub ścieżką prefixową, i ogranicza oprogramowanie pośredniczące do zastosowania jedynie w żądaniach o ścieżkach rozpoczynających się od tej ścieżki.
Dodawanie Ograniczeń Trasy podczas Wykonywania
Ze względów projektowych i wydajnościowych, dynamiczne dodawanie tras po uruchomieniu aplikacji nie jest obsługiwane. Proszę upewnij się, że wszystkie trasy są zdefiniowane przed uruchomieniem aplikacji.
Grupowanie
Jeśli masz wiele punktów końcowych, możesz użyć Group
, aby zorganizować trasy.
func main() {
app := fiber.New()
api := app.Group("/api", oprogramowanie) // /api
v1 := api.Group("/v1", oprogramowanie) // /api/v1
v1.Get("/lista", obsługa) // /api/v1/lista
v1.Get("/użytkownik", obsługa) // /api/v1/użytkownik
v2 := api.Group("/v2", oprogramowanie) // /api/v2
v2.Get("/lista", obsługa) // /api/v2/lista
v2.Get("/użytkownik", obsługa) // /api/v2/użytkownik
log.Fatal(app.Listen(":3000"))
}