You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:05:15