我正在创建一个SPA。 我试图用index.html响应所有请求 (我在前端处理路由)。
我的目录结构如下所示:
后端
- main.go
前端
..(其他一些文件)..
- index.html
整个项目位于“C:\ Go \ Projects \ src \ github.com \ congrady \ Bakalarka”
我的main.go文件如下所示:
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "../Frontend/index.html")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
当我运行我的main.go文件(使用go run)时,我的localhost总是响应“找不到404页面”。 当我尝试使用fmt提供静态内容时,一切正常。
请帮助,我坚持了很长时间,我无法让它工作。 感谢
答案 0 :(得分:0)
请注意,如果您对源文件中的相对路径进行硬编码,则启动应用程序时所在的目录很重要。
在当前配置中,确保从Backend
目录启动应用程序,即
C:\转到\项目\ SRC \ github.com \ congrady \ Bakalarka \后端,
不您的应用根目录
C:\转到\项目\ SRC \ github.com \ congrady \ Bakalarka
或
将主文件中的字符串更改为 Frontend / index.html 并从
运行C:\转到\项目\ SRC \ github.com \ congrady \ Bakalarka
答案 1 :(得分:-1)
使用io/ioutil
包打开HTML文件。示例是index, _ := ioutil.ReadFile("index.html")
。然后写回复w.Write(index)
。
如果要成为动态模板,请使用text/template
包进行解析。请参见示例here。
注意 http.ServeFile
仅用于提供.css
和.js
文件等静态资源。
总而言之,这是一个简单的例子。
package main
import (
"io/ioutil"
"net/http"
"text/template"
)
func main() {
http.HandleFunc("/", rootHandler)
http.HandleFunc("/Frontend/", staticHandler)
http.ListenAndServe(":8080", nil)
}
func staticHandler(res http.ResponseWriter, req *http.Request) {
http.ServeFile(res, req, ".."+req.URL.Path[:]) // <link rel=stylesheet href="/Frontend/style.css">
}
func rootHandler(res http.ResponseWriter, req *http.Request) {
index, _ := ioutil.ReadFile("../Frontend/index.html")
t := template.New("")
t, _ = t.Parse(string(index))
t.Execute(res, nil)
}