2 回答

TA貢獻1797條經驗 獲得超4個贊
您的 Go 服務器設置為僅提供/blog/路徑服務,它通過執行blogHandler. 在您的 Go 服務器中沒有其他任何東西被設置為提供諸如 css、js 或圖像文件之類的資產。
對于這樣的事情,您通常需要FileServer在單獨的路徑上注冊一個單獨的處理程序。例子:
func main() {
http.HandleFunc("/blog/", blogHandler)
// To serve a directory on disk (/path/to/assets/on/my/computer)
// under an alternate URL path (/assets/), use StripPrefix to
// modify the request URL's path before the FileServer sees it:
http.Handle("/assets/", http.StripPrefix("/assets/",
http.FileServer(http.Dir("/path/to/assets/on/my/computer"))))
log.Fatal(http.ListenAndServe(":8080", nil))
}
您需要修復的另一件事是 HTML 中那些資產字段的鏈接,它們應該是絕對的,而不是相對的。
...
<link rel="stylesheet" href="/assets/jsofun.css"></style>
...
<script src="/assets/jsofun.js">
以上當然只有在資產位于/path/to/assets/on/my/computer目錄中時才有效,例如
/path/to/assets/on/my/computer
├── jsofun.css
└── jsofun.js
您blogHandler不必要地為每個請求創建一個新文件而不刪除它,這有可能很快將您的磁盤填滿到其最大容量。要提供模板,您不需要創建新文件,而是可以直接將模板執行到http.ResposeWriter. 還建議只解析一次模板,尤其是在生產代碼中,以避免不必要的資源浪費:
type BlogPost struct {
Title string `json:"title"`
Timestamp string `json:"timestamp"`
Main string `json:"main"`
ContentInfo string `json:"content_info"`
}
var blogTemplate = template.Must(template.ParseFiles("./blogtemplate.html"))
func blogHandler(w http.ResponseWriter, r *http.Request) {
blogstr := r.URL.Path[len("/blog/"):] + ".json"
f, err := os.Open(blogstr)
if err != nil {
http.Error(w, err.Error(), http.StatusNotFound)
return
}
defer f.Close()
var post BlogPost
if err := json.NewDecoder(f).Decode(&post); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := blogTemplate.Execute(w, post); err != nil {
log.Println(err)
}
}

TA貢獻1856條經驗 獲得超11個贊
讓我們研究一下當您請求時會發生什么http://localhost:8000/blog/post#
。
瀏覽器請求頁面;您的代碼成功構建并返回一些html
- 這將包括:
<link rel="stylesheet" href="./jsofun.css"></style>
瀏覽器接收并處理 HTML;作為該過程的一部分,它要求css
上述內容。現在原始請求在文件夾中,/blog/post#
因此./jsofun.css
變為http://localhost:8000/blog/jsofun.css
.
當您的 go 應用程序收到此請求blogHandler
時將被調用(由于請求路徑);它剝離/blog/
然后添加.json
以獲取文件名jsofun.css.json
。然后您嘗試打開此文件并收到錯誤消息,因為它不存在。
有幾種方法可以解決這個問題;更改要使用的模板<link rel="stylesheet" href="/jsofun.css"></style>
可能是一個開始(但我不知道jsofun.css
存儲在哪里,并且您沒有顯示任何可用于該文件的代碼)。我認為還值得注意的是,您不必index.html
在磁盤上創建文件(除非有其他原因需要這樣做)。
(請參閱 mkopriva 對其他問題和進一步步驟的回答 - 在發布該答案時輸入此內容已經進行了一半,并且覺得演練可能仍然有用)。
- 2 回答
- 0 關注
- 152 瀏覽
添加回答
舉報