我在Go中创建了一个服务器,我试图在浏览器中运行一个html文件。但浏览器只是打印出像txt文件的代码,而不是渲染html格式。我的index.html文件保存在/ public目录中。
我的代码如下:
package main
import (
"net/http"
"io/ioutil"
)
func main() {
http.Handle("/", new(MyHandler))
http.ListenAndServe(":8000", nil)
}
type MyHandler struct {
http.Handler
}
func (this *MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
path := "public/" + req.URL.Path
data, err := ioutil.ReadFile(string(path))
if err == nil {
w.Write(data)
} else {
w.WriteHeader(404)
w.Write([]byte("404 - " + http.StatusText(404)))
}
}
答案 0 :(得分:0)
在使用http.HandleFunc("/", ServeHTTP)
的主要尝试中,然后编辑ServeHTTP
方法,以便它没有收件人即; func ServeHTTP(w http.ResponseWriter, req *http.Request)
您尝试使用该对象,Handle
方法也可以正常工作(如果正确实施)但大多数示例都使用HandleFunc
,如果您这样做,我打赌您的问题会消失
导致您观察到的问题的唯一另一件事是无法读取文件的内容被分配给data
或者对该文件中的数据有什么误解实际上是。
答案 1 :(得分:0)
现在你只是阅读文件的内容并将其写出来。由于Go无法告诉文件的类型,因此无法设置标题。
值得庆幸的是,有一个有用的http.ServeFile
函数in the net/http package可以帮助您。
func (this *MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
path := "public/" + req.URL.Path
http.ServeFile(w, r, filepath.Join("path/to/file", path))
}
http.ServeFile
尝试根据文件扩展名或第一个字节设置Content-Type
(对于HTML文件,它应该正确)。
更好的解决方案是让您的路由处理程序为http.FileServer
func main() {
http.Handle("/", http.FileServer(http.Dir("./public"))
http.ListenAndServe(":8000", nil)
}
请看examples in the Go docs如何以其他方式使用它。
无耻的插件:我编写了一个小型中间件库,使您可以在Go中使用的静态文件更容易一些(或者只需阅读代码以获取洞察力):https://github.com/elithrar/station
答案 2 :(得分:0)
首先启动并运行HTML。然后,构建您的HTTP错误处理(例如404)。我建议您从一开始就使用text/template
,即使您没有为您的应用添加任何动力......但是!
package main
import (
"io/ioutil"
"log"
"net/http"
"text/template"
)
func main() {
http.HandleFunc("/", RootHandler)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
func RootHandler(res http.ResponseWriter, req *http.Request) {
file, _ := ioutil.ReadFile("public/index.html")
t := template.New("")
t, _ = t.Parse(string(file))
t.Execute(res, nil)
}
答案 3 :(得分:0)
如果你想推迟使用text/template
软件包并直接提供HTML,只需阅读你的index.html
文件并将其写入响应编写器(例如res
对于我的例子中的响应,然而许多人也使用w
作为编写者。
package main
import (
"io/ioutil"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", RootHandler)
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
func RootHandler(res http.ResponseWriter, req *http.Request) {
file, _ := ioutil.ReadFile("public/index.html")
res.Write(file)
}