我正在创建一个Restful API。
我在JSON中传递函数名和参数
例如。 "localhost/json_server?method=foo&id=1"
让我们说,我有一个简单的服务器运行
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("path",r.URL.Path )
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
.........
function json_server(){
....
}
r.url.Path
会在字符串中为我提供“ json_server
”。现在我想首先检查函数是否存在,如果存在调用函数定义,则抛出一些异常。
这可能吗?
当我在做 python 时,我使用getattr(method,args)
来调用字符串中的方法和参数。
使用Docker后,我对Go产生了兴趣。任何帮助将不胜感激。
答案 0 :(得分:3)
据我所知,使用reflection api无法枚举包的功能,但请参阅this mailing list discussion了解涉及解析源文件的一些想法。枚举对象is possible的方法,实际上更多是你在python中描述的内容。
但是,我建议使用简单的调度表而不是内省,你可以填充map[string]func()
,但我怀疑你可能想要将一些参数传递给你的函数,例如要处理的请求:
var dispatch map[string]http.HandlerFunc
func init() {
dispatch = make(map[string]http.HandlerFunc)
dispatch["json_server"] = json_server
dispatch["foo"] = func(w http.ResponseWriter, r *http.Request) {
...
}
}
func ServeHTTP (w http.ResponseWriter, r *http.Request) {
if handler, exists := dispatch[req.URL.Path]; exists {
handler(w, r)
} else {
... // fallback
}
}
或者更好的是,只需使用现有的HTTP路由器,例如httprouter或gorilla/mux。有很多选择可供选择。