添加編輯和儲存功能
繼續上篇文章【Go基礎學習記錄 - 編寫Web應用程式 - 添加編輯和儲存功能(一)】
如果將上篇文章的邏輯進行構建並運行,試圖訪問一個不存在的wiki,比如/view/APageThatDoesntExist,將看到包含HTML的空頁面。
這是因為它忽略了loadPage的錯誤傳回值,並繼續嘗試填寫沒有資料的模板。
相反,如果請求的頁面不存在,它應該將用戶端重定### 處理不存在的頁面
修改下viewHandler來達到我們的需求,如下
func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] p, err := loadPage(title) if err != nil { http.Redirect(w, r, "/edit/"+title, http.StatusFound) return } renderTemplate(w, "view", p)}
http.Redirect函數將HTTP狀態碼http.StatusFound(302)和Location頭添加到HTTP響應中。
再次構建並運行程式,訪問/view/APageThatDoesntExist,會跳轉到/edit/APageThatDoesntExist。
儲存頁面功能
根據上篇文章的流程,我們來添加下saveHandler函數的處理邏輯,它將處理位於編輯頁面上的表單的提交。
先在main中加入對應的邏輯,如下
func main() { http.HandleFunc("/view/", viewHandler) http.HandleFunc("/edit/", editHandler) http.HandleFunc("/save/", saveHandler) log.Fatal(http.ListenAndServe(":8090", nil))}
saveHandler實現處理常式如下:
func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/save/"):] body := r.FormValue("body") p := &Page{ Title: title, Body: []byte(body), } p.save() http.Redirect(w, r, "/view/"+title, http.StatusFound)}
頁面標題(在URL中提供)和表單的唯一欄位Body儲存在新頁面中。
然後調用save()方法將資料寫入檔案,並將用戶端重新導向到/view/page。
FormValue返回的值是string類型。
我們必須將該值轉換為[]byte,然後才能適應Page結構。
我們使用[]byte(body)來執行轉換。
到這裡整個的編輯和儲存就都完成了,我們可以再次進行構建程式,然後啟動
$ go build wiki.go$ ./wiki
訪問view/pageTitle,不存在則進行建立,通過表單提交進行儲存,還可以繼續修改並儲存。