在 net/http 中,处理运行时注册的处理程序需要自定义方法。虽然 HTTP 服务器提供了注册处理程序的机制,但它缺乏动态取消注册处理程序的能力。
要动态创建和注册处理程序,您可以使用自定义 HandlerFactory。这可以设计为生成具有唯一 ID 的新处理程序并使用 http.Handle 注册它们。例如,“/create”处理程序可以生成具有递增 ID 的 MyHandler 实例,并将它们映射到特定的 URL 模式。
<code class="go">type HandlerFactory struct { handler_id int } func (hf *HandlerFactory) ServeHTTP(w http.ResponseWriter, r *http.Request) { hf.handler_id++ handler := MyHandler{hf.handler_id} handle := fmt.Sprintf("/%d/", hf.handler_id) http.Handle(handle, &handler) }</code>
要提供未注册的处理程序,您需要创建一个扩展原始 ServeMux 并包含取消注册方法的自定义 ServerMux。
<code class="go">type MyMux struct { http.ServeMux mu sync.Mutex } func (mux *MyMux) Deregister(pattern string) error { mux.mu.Lock() defer mux.mu.Unlock() del(mux.m, pattern) // Handle additional error checking or setup here }</code>
要使用此自定义 ServerMux,您可以实例化一个新的 ServerMux 并包装它使用 http.Handler 在 HTTP 服务器内:
<code class="go">mux := new(MyMux) mux.Handle("/create", &factory) srv := &http.Server{ Addr: "localhost:8080", Handler: mux, } go srv.ListenAndServe() // Deregister handlers as needed mux.Deregister("/123/*")</code>
此方法允许您动态注册和取消注册处理程序,提供处理运行时生成的 URL 模式所需的灵活性。
以上是如何在 Go 的 net/http 包中动态注册和取消注册 HTTP 处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!