当前位置: 首页 > 面试题库 >

如何从处理程序内部按名称调用路由?

潘宝
2023-03-14
问题内容

如何从处理程序内部正确引用路由名称?
应该mux.NewRouter()全局分配而不是放在函数内部?

func AnotherHandler(writer http.ResponseWriter, req *http.Request) {
    url, _ := r.Get("home") // I suppose this 'r' should refer to the router
    http.Redirect(writer, req, url, 302)
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler).Name("home")
    r.HandleFunc("/nothome/", AnotherHandler).Name("another")
    http.Handle("/", r)
    http.ListenAndServe(":8000", nil)
}

问题答案:

您具有mux.CurrentRoute()返回给定请求的路由的方法。根据该请求,您可以创建一个子路由器并调用Get("home")

示例:(播放:http :
//play.golang.org/p/Lz10YUyP6e)

package main

import (
        "fmt"
        "net/http"

        "github.com/gorilla/mux"
)

func HomeHandler(writer http.ResponseWriter, req *http.Request) {
        writer.WriteHeader(200)
        fmt.Fprintf(writer, "Home!!!\n")
}

func AnotherHandler(writer http.ResponseWriter, req *http.Request) {
        url, err := mux.CurrentRoute(req).Subrouter().Get("home").URL()
        if err != nil {
                panic(err)
        }
        http.Redirect(writer, req, url.String(), 302)
}

func main() {
        r := mux.NewRouter()
        r.HandleFunc("/home", HomeHandler).Name("home")
        r.HandleFunc("/nothome/", AnotherHandler).Name("another")
        http.Handle("/", r)
        http.ListenAndServe(":8000", nil)

}


 类似资料:
  • 问题内容: 为了娱乐并更好地学习Go,我正在尝试在Go中重新实现抗原。 问题是:是shell内置函数,所以我不能用 function 调用它,因为它希望在中有可执行文件。 我怎样才能做到这一点?并且,是否有可能使go程序内部的程序影响用户shell? 问题答案: 您可以直接在终端设备中编写命令。但是,要做到这一点,首先您需要知道哪个设备正在使用该用户。执行程序的脚本可能是解决方案。 然后,程序必须

  • 我需要从OracleIdtyManager中的自定义后处理事件处理程序调用外部REST API? 如果有人有想法,请在这里发布。

  • 如何从容器内部获取docker的容器名称? 我不能使用“inspect”,因为我必须使用容器内部的脚本从JSON url获取信息。

  • 问题内容: 众所周知,代理对象时,例如为Spring / EJB创建具有事务属性的Bean时,甚至当您使用某些框架创建部分模拟时,代理对象都不知道,内部调用也不会重定向,然后也没有被拦截… 这就是为什么如果您在Spring中做类似的事情: 当您致电doSomething时,您希望除了主要交易外还有3个新交易,但是实际上,由于这个问题,您只会得到一个新交易… 所以我想知道您如何处理此类问题… 实际上

  • 我有一个异步特质方法,它返回一个std Future: < code>ResultType是trait的关联类型,它是< code>Sync Send。 请注意,此类型不是Unpin类型。 我想从actix处理程序调用它,然后对结果做些什么。 例如: 这会失败,因为拥有未来,这是不允许的。清除的错误消息如下所示: 我该怎么做?

  • 我想知道一个应用程序的包名,我只知道那个应用程序的应用程序名。假设我想知道一个电子邮件应用程序的包名,只是它的名字,然后如何得到它 我只知道应用程序名。 这是代码,以获得所有的应用程序的包名称,但我需要知道特定的应用程序。