Go基礎學習記錄 - 編寫Web應用程序 - 添加編輯和保存功能(二)

添加編輯和保存功能

繼續上篇文章【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。ui

保存頁面功能

根據上篇文章的流程,咱們來添加下saveHandler函數的處理邏輯,它將處理位於編輯頁面上的表單的提交。
先在main中加入對應的邏輯,以下code

func main() {
    http.HandleFunc("/view/", viewHandler)
    http.HandleFunc("/edit/", editHandler)
    http.HandleFunc("/save/", saveHandler)
    log.Fatal(http.ListenAndServe(":8090", nil))
}

saveHandler實現處理程序以下:orm

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)來執行轉換。blog

到這裏整個的編輯和存儲就都完成了,咱們能夠再次進行構建程序,而後啓動get

$ go build wiki.go
$ ./wiki

訪問view/pageTitle,不存在則進行建立,經過表單提交進行保存,還能夠繼續修改並保存。string

相關文章
相關標籤/搜索