2 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的 Go 服務(wù)器設(shè)置為僅提供/blog/路徑服務(wù),它通過(guò)執(zhí)行blogHandler. 在您的 Go 服務(wù)器中沒(méi)有其他任何東西被設(shè)置為提供諸如 css、js 或圖像文件之類的資產(chǎn)。
對(duì)于這樣的事情,您通常需要FileServer在單獨(dú)的路徑上注冊(cè)一個(gè)單獨(dú)的處理程序。例子:
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))
}
您需要修復(fù)的另一件事是 HTML 中那些資產(chǎn)字段的鏈接,它們應(yīng)該是絕對(duì)的,而不是相對(duì)的。
...
<link rel="stylesheet" href="/assets/jsofun.css"></style>
...
<script src="/assets/jsofun.js">
以上當(dāng)然只有在資產(chǎn)位于/path/to/assets/on/my/computer目錄中時(shí)才有效,例如
/path/to/assets/on/my/computer
├── jsofun.css
└── jsofun.js
您blogHandler不必要地為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新文件而不刪除它,這有可能很快將您的磁盤(pán)填滿到其最大容量。要提供模板,您不需要?jiǎng)?chuàng)建新文件,而是可以直接將模板執(zhí)行到http.ResposeWriter. 還建議只解析一次模板,尤其是在生產(chǎn)代碼中,以避免不必要的資源浪費(fèi):
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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
讓我們研究一下當(dāng)您請(qǐng)求時(shí)會(huì)發(fā)生什么http://localhost:8000/blog/post#
。
瀏覽器請(qǐng)求頁(yè)面;您的代碼成功構(gòu)建并返回一些html
- 這將包括:
<link rel="stylesheet" href="./jsofun.css"></style>
瀏覽器接收并處理 HTML;作為該過(guò)程的一部分,它要求css
上述內(nèi)容?,F(xiàn)在原始請(qǐng)求在文件夾中,/blog/post#
因此./jsofun.css
變?yōu)?code>http://localhost:8000/blog/jsofun.css.
當(dāng)您的 go 應(yīng)用程序收到此請(qǐng)求blogHandler
時(shí)將被調(diào)用(由于請(qǐng)求路徑);它剝離/blog/
然后添加.json
以獲取文件名jsofun.css.json
。然后您嘗試打開(kāi)此文件并收到錯(cuò)誤消息,因?yàn)樗淮嬖凇?/p>
有幾種方法可以解決這個(gè)問(wèn)題;更改要使用的模板<link rel="stylesheet" href="/jsofun.css"></style>
可能是一個(gè)開(kāi)始(但我不知道jsofun.css
存儲(chǔ)在哪里,并且您沒(méi)有顯示任何可用于該文件的代碼)。我認(rèn)為還值得注意的是,您不必index.html
在磁盤(pán)上創(chuàng)建文件(除非有其他原因需要這樣做)。
(請(qǐng)參閱 mkopriva 對(duì)其他問(wèn)題和進(jìn)一步步驟的回答 - 在發(fā)布該答案時(shí)輸入此內(nèi)容已經(jīng)進(jìn)行了一半,并且覺(jué)得演練可能仍然有用)。
- 2 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報(bào)