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)发行。