gpt4 book ai didi

go - 多目录服务不工作

转载 作者:IT王子 更新时间:2023-10-29 02:32:39 25 4
gpt4 key购买 nike

下面的代码有错误吗?多目录服务不适用于以下代码。当我访问localhost:9090/ide时,服务器会返回404错误。

package main

import (
"log"
"net/http"
)

func serveIDE(w http.ResponseWriter, r *http.Request) {
http.FileServer(http.Dir("/home/user/ide")).ServeHTTP(w, r)
}

func serveConsole(w http.ResponseWriter, r *http.Request) {
http.FileServer(http.Dir("/home/user/console")).ServeHTTP(w, r)
}

func main() {
http.HandleFunc("/ide", serveIDE)
http.HandleFunc("/console", serveConsole)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

当我像这样更改代码时,

http.HandleFunc("/", serveIDE)

它将按我的预期工作。

最佳答案

使用 http.FileServer 的一个问题是请求路径用于构建文件名,因此如果您从除根以外的任何地方提供服务,则需要去除路由前缀给那个处理程序。

标准库包含一个对 http.StripPrefix 有用的工具,但它只适用于 http.Handler,不适用于 http.HandleFuncs,因此要使用它,您需要将 HandleFunc 调整为 Handler

这是一个可以满足您要求的工作版本。请注意,wHandler 只是从您的 HttpFunc 方法到 Hander 接口(interface)的适配器:

package main

import (
"log"
"net/http"
)

func serveIDE(w http.ResponseWriter, r *http.Request) {
http.FileServer(http.Dir("/home/user/ide")).ServeHTTP(w, r)
}

func serveConsole(w http.ResponseWriter, r *http.Request) {
http.FileServer(http.Dir("/home/user/console")).ServeHTTP(w, r)
}

type wHandler struct {
fn http.HandlerFunc
}

func (h *wHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Printf("Handle request: %s %s", r.Method, r.RequestURI)
defer log.Printf("Done with request: %s %s", r.Method, r.RequestURI)
h.fn(w, r)
}

func main() {
http.Handle("/ide", http.StripPrefix("/ide", &wHandler{fn: serveIDE}))
http.Handle("/console", http.StripPrefix("/console", &wHandler{fn: serveConsole}))
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

关于go - 多目录服务不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com