Golang中如何向fasthttp-router传递URL参数?
问题原因与解决方法
你的问题出在fasthttp router的参数匹配规则上:默认的{url}只会匹配单段路径(两个斜杠之间的内容),当URL包含多级路径时,路由根本匹配不上,所以返回404。
解决步骤
1. 修改路由匹配规则
把路由从/free-riding/{url}改成/free-riding/{url:*},这里的*是通配符,表示匹配/free-riding/之后的所有内容,包括带多级斜杠的路径。
2. 对URL参数进行解码
浏览器会自动对URL中的特殊字符(比如非ASCII字符、部分符号)进行编码,拿到参数后必须解码才能得到原始URL内容,避免传递给lynx时出现异常。
修改后的完整代码
package main import ( "fmt" "log" "net/url" "os/exec" "github.com/fasthttp/router" "github.com/valyala/fasthttp" ) func Lynx(ctx *fasthttp.RequestCtx) { // 先做类型断言,避免panic rawUrl, ok := ctx.UserValue("url").(string) if !ok { ctx.Error("无效的URL参数", fasthttp.StatusBadRequest) return } // 解码URL参数 decodedUrl, err := url.QueryUnescape(rawUrl) if err != nil { ctx.Error("URL解码失败", fasthttp.StatusBadRequest) return } cmd := exec.Command("lynx", "--dump", decodedUrl) stdout, err := cmd.Output() if err != nil { // 不要用log.Fatal,它会直接终止服务,应该返回错误给客户端 ctx.Error(fmt.Sprintf("执行lynx命令失败: %v", err), fasthttp.StatusInternalServerError) return } fmt.Fprintf(ctx, "%s\n", stdout) } func main() { r := router.New() // 用通配符匹配多级路径 r.GET("/free-riding/{url:*}", Lynx) log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler)) }
额外注意点
- 不要用
log.Fatal处理请求中的错误,它会直接终止整个服务,应该用ctx.Error返回错误响应给客户端。 - 增加类型断言判断,避免参数类型错误导致程序崩溃。
- 可根据需求增加URL合法性验证,比如检查是否包含http/https协议头,防范恶意输入。
内容的提问来源于stack exchange,提问作者BuddhiLW
相关产品推荐
相关产品推荐

