Fiber是建立在Fasthttp之上的明確靈感的Web框架,Fasthttp是最快的HTTP引擎。旨在簡化零內存分配和性能的快速發展。
Fiber V3目前正在Beta中,並且正在積極開發。雖然它提供了令人興奮的新功能,但請注意,它可能不穩定生產使用。我們建議堅持最新的穩定版本(V2.X),以進行關鍵任務應用程序。如果您選擇使用V3,請為潛在的錯誤和破壞更改做好準備。始終檢查官方文檔並發表說明以獲取更新,然後謹慎行事。愉快的編碼!
光纖需要運行1.23版或更高版本。如果您需要安裝或升級,請訪問官方GO下載頁面。要開始設置項目,請為您的項目創建一個新目錄,然後導航。然後,通過在終端中執行以下命令來初始化項目:
go mod init github.com/your/repo要了解有關GO模塊及其工作方式的更多信息,您可以查看使用GO模塊博客文章。
設置項目後,您可以使用go get命令安裝光纖:
go get -u github.com/gofiber/fiber/v3此命令獲取光纖軟件包,並將其添加到項目的依賴項中,從而使您可以開始使用光纖構建Web應用程序。
開始使用纖維很容易。這是創建一個簡單的Web服務器的基本示例,該服務器響應“ Hello,World!”在根路徑上。此示例演示了初始化新的光纖應用程序,設置路由並啟動服務器。
package main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func main () {
// Initialize a new Fiber app
app := fiber . New ()
// Define a route for the GET method on the root path '/'
app . Get ( "/" , func ( c fiber. Ctx ) error {
// Send a string response to the client
return c . SendString ( "Hello, World !" )
})
// Start the server on port 3000
log . Fatal ( app . Listen ( ":3000" ))
}這款簡單的服務器易於設置和運行。它介紹了光纖的核心概念:應用程序初始化,路由定義和啟動服務器。只需運行此GO程序,然後訪問http://localhost:3000在瀏覽器中查看消息。
光纖是針對高性能的優化,含義從光纖返回的值默認情況下是不可變的,並且會在請求中重新使用。根據經驗,您必須僅在處理程序中使用上下文值,並且不能保留任何參考。一旦您從處理程序返回,從上下文中獲得的任何值將在以後的請求中重新使用。訪問我們的文檔以了解更多信息。
這些測試由Techempower和Go Web執行。如果您想查看所有結果,請訪問我們的Wiki。
從Node.js轉移的新地震者正在處理學習曲線,然後才能開始構建其Web應用程序或微服務。作為一個網絡框架,Fiber是通過極簡主義的想法創建的,並遵循Unix的方式,以便新的地鼠能夠以熱情而值得信賴的歡迎來迅速進入Go的世界。
Fiber的靈感來自Express,這是Internet上最受歡迎的Web框架。我們結合了GO的明確表現和原始表現的便利性。如果您曾經在Node.js(使用Express或類似)中實現Web應用程序,那麼您似乎很常見。
我們在問題,Discord渠道和互聯網上傾聽用戶,為任何任務,截止日期和開發人員技能創建快速,靈活和友好的GO Web框架!就像Express在JavaScript世界中一樣。
下面列出的是一些常見示例。如果您想查看更多代碼示例,請訪問我們的食譜存儲庫或訪問我們的託管API文檔。
package main
import (
"fmt"
"log"
"github.com/gofiber/fiber/v3"
)
func main () {
app := fiber . New ()
// GET /api/register
app . Get ( "/api/*" , func ( c fiber. Ctx ) error {
msg := fmt . Sprintf ( " %s" , c . Params ( "*" ))
return c . SendString ( msg ) // => register
})
// GET /flights/LAX-SFO
app . Get ( "/flights/:from-:to" , func ( c fiber. Ctx ) error {
msg := fmt . Sprintf ( "? From: %s, To: %s" , c . Params ( "from" ), c . Params ( "to" ))
return c . SendString ( msg ) // => ? From: LAX, To: SFO
})
// GET /dictionary.txt
app . Get ( "/:file.:ext" , func ( c fiber. Ctx ) error {
msg := fmt . Sprintf ( "? %s.%s" , c . Params ( "file" ), c . Params ( "ext" ))
return c . SendString ( msg ) // => ? dictionary.txt
})
// GET /john/75
app . Get ( "/:name/:age/:gender?" , func ( c fiber. Ctx ) error {
msg := fmt . Sprintf ( "? %s is %s years old" , c . Params ( "name" ), c . Params ( "age" ))
return c . SendString ( msg ) // => ? john is 75 years old
})
// GET /john
app . Get ( "/:name" , func ( c fiber. Ctx ) error {
msg := fmt . Sprintf ( "Hello, %s !" , c . Params ( "name" ))
return c . SendString ( msg ) // => Hello john !
})
log . Fatal ( app . Listen ( ":3000" ))
} package main
import (
"encoding/json"
"fmt"
"log"
"github.com/gofiber/fiber/v3"
)
func main () {
app := fiber . New ()
app . Get ( "/api/*" , func ( c fiber. Ctx ) error {
msg := fmt . Sprintf ( " %s" , c . Params ( "*" ))
return c . SendString ( msg ) // => register
}). Name ( "api" )
route := app . GetRoute ( "api" )
data , _ := json . MarshalIndent ( route , "" , " " )
fmt . Println ( string ( data ))
// Prints:
// {
// "method": "GET",
// "name": "api",
// "path": "/api/*",
// "params": [
// "*1"
// ]
// }
log . Fatal ( app . Listen ( ":3000" ))
} package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/static"
)
func main () {
app := fiber . New ()
// Serve static files from the "./public" directory
app . Get ( "/*" , static . New ( "./public" ))
// => http://localhost:3000/js/script.js
// => http://localhost:3000/css/style.css
app . Get ( "/prefix*" , static . New ( "./public" ))
// => http://localhost:3000/prefix/js/script.js
// => http://localhost:3000/prefix/css/style.css
// Serve a single file for any unmatched routes
app . Get ( "*" , static . New ( "./public/index.html" ))
// => http://localhost:3000/any/path/shows/index.html
log . Fatal ( app . Listen ( ":3000" ))
} package main
import (
"fmt"
"log"
"github.com/gofiber/fiber/v3"
)
func main () {
app := fiber . New ()
// Middleware that matches any route
app . Use ( func ( c fiber. Ctx ) error {
fmt . Println ( "? First handler" )
return c . Next ()
})
// Middleware that matches all routes starting with /api
app . Use ( "/api" , func ( c fiber. Ctx ) error {
fmt . Println ( "? Second handler" )
return c . Next ()
})
// GET /api/list
app . Get ( "/api/list" , func ( c fiber. Ctx ) error {
fmt . Println ( "? Last handler" )
return c . SendString ( "Hello, World !" )
})
log . Fatal ( app . Listen ( ":3000" ))
}配置引擎渲染
當未設置視圖引擎時,將默認為HTML/模板。
如果要執行部分或使用其他引擎,例如琥珀色,車把,鬍鬚或哈巴狗等,請查看我們支持多個視圖引擎的模板包。
package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/template/pug"
)
func main () {
// Initialize a new Fiber app with Pug template engine
app := fiber . New (fiber. Config {
Views : pug . New ( "./views" , ".pug" ),
})
// Define a route that renders the "home.pug" template
app . Get ( "/" , func ( c fiber. Ctx ) error {
return c . Render ( "home" , fiber. Map {
"title" : "Homepage" ,
"year" : 1999 ,
})
})
log . Fatal ( app . Listen ( ":3000" ))
}團體
package main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func middleware ( c fiber. Ctx ) error {
log . Println ( "Middleware executed" )
return c . Next ()
}
func handler ( c fiber. Ctx ) error {
return c . SendString ( "Handler response" )
}
func main () {
app := fiber . New ()
// Root API group with middleware
api := app . Group ( "/api" , middleware ) // /api
// API v1 routes
v1 := api . Group ( "/v1" , middleware ) // /api/v1
v1 . Get ( "/list" , handler ) // /api/v1/list
v1 . Get ( "/user" , handler ) // /api/v1/user
// API v2 routes
v2 := api . Group ( "/v2" , middleware ) // /api/v2
v2 . Get ( "/list" , handler ) // /api/v2/list
v2 . Get ( "/user" , handler ) // /api/v2/user
log . Fatal ( app . Listen ( ":3000" ))
}記錄器
package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/logger"
)
func main () {
app := fiber . New ()
// Use Logger middleware
app . Use ( logger . New ())
// Define routes
app . Get ( "/" , func ( c fiber. Ctx ) error {
return c . SendString ( "Hello, Logger!" )
})
log . Fatal ( app . Listen ( ":3000" ))
}科爾斯
package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/cors"
)
func main () {
app := fiber . New ()
// Use CORS middleware with default settings
app . Use ( cors . New ())
// Define routes
app . Get ( "/" , func ( c fiber. Ctx ) error {
return c . SendString ( "CORS enabled!" )
})
log . Fatal ( app . Listen ( ":3000" ))
}通過傳遞Origin標題中的任何域來檢查CORS:
curl -H " Origin: http://example.com " --verbose http://localhost:3000HTTP方法
package main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func main () {
app := fiber . New ()
// Define routes
app . Get ( "/" , static . New ( "./public" ))
app . Get ( "/demo" , func ( c fiber. Ctx ) error {
return c . SendString ( "This is a demo page!" )
})
app . Post ( "/register" , func ( c fiber. Ctx ) error {
return c . SendString ( "Registration successful!" )
})
// Middleware to handle 404 Not Found
app . Use ( func ( c fiber. Ctx ) error {
return c . SendStatus ( fiber . StatusNotFound ) // => 404 "Not Found"
})
log . Fatal ( app . Listen ( ":3000" ))
}JSON
package main
import (
"log"
"github.com/gofiber/fiber/v3"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main () {
app := fiber . New ()
// Route that returns a JSON object
app . Get ( "/user" , func ( c fiber. Ctx ) error {
return c . JSON ( & User { "John" , 20 })
// => {"name":"John", "age":20}
})
// Route that returns a JSON map
app . Get ( "/json" , func ( c fiber. Ctx ) error {
return c . JSON (fiber. Map {
"success" : true ,
"message" : "Hi John!" ,
})
// => {"success":true, "message":"Hi John!"}
})
log . Fatal ( app . Listen ( ":3000" ))
}Websocket
package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/websocket"
)
func main () {
app := fiber . New ()
// WebSocket route
app . Get ( "/ws" , websocket . New ( func ( c * websocket. Conn ) {
defer c . Close ()
for {
// Read message from client
mt , msg , err := c . ReadMessage ()
if err != nil {
log . Println ( "read:" , err )
break
}
log . Printf ( "recv: %s" , msg )
// Write message back to client
err = c . WriteMessage ( mt , msg )
if err != nil {
log . Println ( "write:" , err )
break
}
}
}))
log . Fatal ( app . Listen ( ":3000" ))
// Connect via WebSocket at ws://localhost:3000/ws
}更多信息
package main
import (
"bufio"
"fmt"
"log"
"time"
"github.com/gofiber/fiber/v3"
"github.com/valyala/fasthttp"
)
func main () {
app := fiber . New ()
// Server-Sent Events route
app . Get ( "/sse" , func ( c fiber. Ctx ) error {
c . Set ( "Content-Type" , "text/event-stream" )
c . Set ( "Cache-Control" , "no-cache" )
c . Set ( "Connection" , "keep-alive" )
c . Set ( "Transfer-Encoding" , "chunked" )
c . Context (). SetBodyStreamWriter ( func ( w * bufio. Writer ) {
var i int
for {
i ++
msg := fmt . Sprintf ( "%d - the time is %v" , i , time . Now ())
fmt . Fprintf ( w , "data: Message: %s n n " , msg )
fmt . Println ( msg )
w . Flush ()
time . Sleep ( 5 * time . Second )
}
})
return nil
})
log . Fatal ( app . Listen ( ":3000" ))
}恢復
package main
import (
"log"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/recover"
)
func main () {
app := fiber . New ()
// Use Recover middleware to handle panics gracefully
app . Use ( recover . New ())
// Route that intentionally panics
app . Get ( "/" , func ( c fiber. Ctx ) error {
panic ( "normally this would crash your app" )
})
log . Fatal ( app . Listen ( ":3000" ))
}config
package main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func main () {
app := fiber . New (fiber. Config {
// Configure trusted proxies - WARNING: Only trust proxies you control
// Using TrustProxy: true with unrestricted IPs can lead to IP spoofing
TrustProxy : true ,
TrustProxyConfig : fiber. TrustProxyConfig {
Proxies : [] string { "10.0.0.0/8" , "172.16.0.0/12" }, // Example: Internal network ranges only
},
ProxyHeader : fiber . HeaderXForwardedFor ,
})
// Define routes
app . Get ( "/" , func ( c fiber. Ctx ) error {
return c . SendString ( "Trusted Proxy Configured!" )
})
log . Fatal ( app . Listen ( ":3000" ))
}這是光纖框架中包含的中間件列表。
| 中介軟體 | 描述 |
|---|---|
| 適配器 | 網絡/HTTP處理程序的轉換器轉換為/從光纖請求處理程序。 |
| 基本auth | 提供HTTP基本身份驗證。它撥打了有效憑據的下一個處理程序,而401卻未經授權,因為缺失或無效的憑據。 |
| 快取 | 攔截和緩存HTTP響應。 |
| 壓縮 | 纖維的壓縮中間件,並支持deflate , gzip , brotli和zstd 。 |
| 科爾斯 | 啟用具有各種選項的交叉原始資源共享(CORS)。 |
| CSRF | 防止CSRF漏洞利用。 |
| 早日 | 增加了對TLS 1.3的早期數據(“ 0-RTT”)功能的支持。 |
| EncryptCookie | 加密中間件加密cookie值。 |
| envvar | 通過提供可選的配置來公開環境變量。 |
| etag | 允許緩存更有效並節省帶寬,因為如果內容沒有更改,則Web服務器無需重新響應。 |
| Expvar | 通過其HTTP服務器運行時曝光變量以JSON格式提供服務。 |
| Favicon | 如果提供了文件路徑,則忽略日誌中的favicon或從內存中提供。 |
| HealthCheck | 纖維的輕鬆和準備探針。 |
| 頭盔 | 通過設置各種HTTP標頭來幫助保護您的應用程序。 |
| 勢力 | 允許易於故障的API,其中重複的請求不會錯誤地導致在服務器端多次執行的相同操作。 |
| Keyauth | 增加了對基於密鑰的身份驗證的支持。 |
| 限制器 | 向纖維增加限制速率的支撐。用於將重複的請求限制為公共API和/或端點,例如密碼重置。 |
| 記錄器 | HTTP請求/響應記錄器。 |
| pprof | 以PPROF格式提供運行時分析數據。 |
| 代理人 | 允許您代理多個服務器的請求。 |
| 恢復 | 從堆棧鏈中的任何地方的恐慌中恢復,並將控件處理到集中式錯誤Handler。 |
| 重定向 | 重定向中間軟件。 |
| requestId | 為每個請求添加請求ID。 |
| 改寫 | 根據提供的規則重寫URL路徑。它可能有助於向後兼容,也可以創建更清潔和更具描述性的鏈接。 |
| 會議 | 會話中間軟件。注意:此中間件使用我們的存儲軟件包。 |
| 跳過 | 如果謂詞為真,則跳過中間件,可以跳過包裹的處理程序。 |
| 靜止的 | 用於提供靜態文件的光纖的靜態中間件,例如圖像, CSS和JavaScript 。 |
| 暫停 | 如果超出該請求,請添加最大時間的時間,並將其轉發到errorhandler。 |
外部託管的中間件模塊列表,並由光纖團隊維護。
| 中介軟體 | 描述 |
|---|---|
| 貢獻 | 第三方中間 |
| 貯存 | 預製了實現存儲界面的存儲驅動程序,該驅動器旨在與各種纖維中間Wares一起使用。 |
| 模板 | 該軟件包包含9個模板引擎,可與光纖v3一起使用。需要1.23版或更高版本。 |
有關更多文章,中間件,示例或工具,請查看我們的真棒列表。
如果您想說謝謝和/或支持Fiber的積極開發:
為了確保您的貢獻已準備就緒,請使用以下Makefile命令。這些工具有助於保持代碼質量和一致性。
運行這些命令以確保您的代碼遵守項目標準和最佳實踐。
Fiber是一個開源項目,它以捐款來支付賬單,例如我們的域名,GitBook,Netlify和無服務器託管。如果您想支持纖維,則可以在這裡購買咖啡。
| 用戶 | 捐款 | |
|---|---|---|
| @destari | ☕x 10 | |
| @dembygenesis | ☕x 5 | |
| @thomasvvugt | ☕x 5 | |
| @hendratommy | ☕x 5 | |
| @ekaputra07 | ☕x 5 | |
| @jorgefuertes | ☕x 5 | |
| @candidosales | ☕x 5 | |
| @l0nax | ☕x 3 | |
| @bihe | ☕x 3 | |
| @justdave | ☕x 3 | |
| @koddr | ☕x 1 | |
| @lapolinar | ☕x 1 | |
| @diegowifi | ☕x 1 | |
| @ssimk0 | ☕x 1 | |
| @RayMayemir | ☕x 1 | |
| @melkorm | ☕x 1 | |
| @marvinjwendt | ☕x 1 | |
| @toishy | ☕x 1 |
版權(c)2019年至今的芬尼和貢獻者。 Fiber是根據MIT許可證許可的免費和開源軟件。官方徽標是由VicShóstak創建的,並根據Creative Commons許可(CC BY-SA 4.0 International)發行。