【Go】go修行18日目構造化されたWebサーバ

パッケージ メイン
インポート (
"html / template"
"io / ioutil"
"log"
"net / http"
)
タイプ Page struct {
Title string
Body [] byte
}
func (p * Page ) save () error {
filename := p 。タイトル + ".txt"は
ioutilを返し ます。WriteFile (ファイル名、 p 。本文、 0600 )
}
func loadPage (title string ) (* Page 、 error ) {
filename := title + ".txt"
body 、 err := ioutil 。ReadFile (filename )
if err != nil {
return nil 、 err
}
return &Page { Title : title 、 Body : body }、 nil
}
// HTMLファイルのテンプレートを指定できる
//直接書いてもいいけれどソースがわかりにくくなる
FUNC renderTemplate (ワット のhttp 。ResponseWriter 、 TMPL 文字列、 P * ページ)
{
//ローカルのHTMLファイルを指定
トン、 _ : = テンプレート。ParseFiles (TMPL + ".htmlを" )
トン。実行(w 、 p )
}
FUNC のViewHandler (W HTTP 。ResponseWriter 、 R * HTTP 。リクエスト) {
タイトル := R 。URL 。パス[ len ("/ view /" ):]
p 、 err := loadPage (title )
//
もし エラー (ページがなかったら)editページへリダイレクトされるif err != nil {
http 。リダイレクト(W 、 R 、 "/編集/" + タイトル、 HTTP 。StatusFound )
リターン
}
renderTemplate (W 、 "ビュー" 、 P )
}
FUNC editHandler (W HTTP 。ResponseWriter 、 R * HTTP 。リクエスト) {
タイトル := R 。URL 。Path [ len ("/ edit /" ):]
p 、 err := loadPage (title )
if err != nil {
p = &Page { Title : title }
}
renderTemplate (w 、 「編集」、 p )
}
FUNC saveHandler (W HTTP 。ResponseWriter 、 R * HTTP 。リクエスト) {
タイトル := R 。URL 。パス[ len ("/ save /" ):]
body := r 。FormValue ("body" )
p := &Page { Title : title 、 Body : [] byte (body )}
err := p 。save ()
// saveに失敗したら、500
エラーif err != nil {
http 。エラー(W 、 ERR 。エラー()、 HTTP 。StatusInternalServerError )
リターン
}
HTTP 。リダイレクト(W 、 R 、 "/ビュー/" + タイトル、 HTTP 。StatusFound )
}
func main () {
http 。HandleFunc ("/ view /" 、 viewHandler )
http 。HandleFunc ("/ edit /" 、 editHandler )
http 。HandleFunc ("/ save /" 、 saveHandler )
// /に
アクセスしたり/ view以外にアクセスすると404NOTFOUND log 。致命的(HTTP 。
ListenAndServe (":8080" 、 nilの))
}
<h1> {{.Title}}を編集しています</ h1>
<form action = "/save/{{.Title}}" method = "POST" >
<div>
<textarea name = "body" rows = "20" cols = "80"
> {{printf "%s"。本文}} </ textarea>
</ div>
<div>
<input type = "submit" value = "Save" >
</ div>
</ form>
<h1> {{.Title}} </ h1>
<P> [ <a href= "/edit/{{.Title}}">編集する</a> ] </ P>
<div> {{printf "%s" .Body}} </ div>
https://www.udemy.com/course/go-fintech/learn/lecture/12088980