为了账号安全,请及时绑定邮箱和手机立即绑定

httprouter,使用带有扩展名的路由路径

httprouter,使用带有扩展名的路由路径

Go
沧海一幻觉 2022-07-18 10:03:41
我正在将httprouter用于由 golang 提供支持的简单 json api 服务器。我想要两条带有命名参数的路由,由两个不同的处理程序提供服务例如,我需要/v1/1234和/v1/1234.json    router.GET("/v1/:id", Content)     router.GET("/v1/:id.json", ContentJson)但是命名参数只匹配一个路径段我可以用其他方法解决这个问题吗?
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

就像你说的,命名参数匹配整个路径段。您可以通过检查单个处理程序中的后缀并从那里分支来解决此问题。


router.GET("/v1/:id", Content)


func Content(w http.ResponseWriter, r *http.Request) {

    params := httprouter.ParamsFromContext(r.Context())


    if strings.HasSuffix(params.ByName("id"), ".json") {

        ContentJson()

    } else {

        ContentDefault()

    }

}

在没有多个处理程序的情况下处理不同响应类型的另一种方法是使用Accept标头。


router.GET("/v1/:id", Content)


func Content(w http.ResponseWriter, r *http.Request) {

    if r.Header.Get("Accept") == "application/json" {

        ContentJson()

    } else {

        ContentDefault()

    }

}

然后,您将在请求中设置标头。这可能是最干净的解决方案,但对所有用户来说并不那么简单。


curl -H "Accept: application/json" 'http://my.api/v1/:id`


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信