構造化されたWebサーバ

メイン

main.go
パッケージ メイン

インポート (
    "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の))
}



/ editとなるhtmlファイル

edit.html
<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>

/ viewとなるhmtlファイル

view.html
<h1> {{.Title}} </ h1>

<P> [ <a  href= "/edit/{{.Title}}">編集する</a> ] </ P>

<div> {{printf "%s" .Body}} </ div>

動作確認

editページでhtmlファイル生成image.png

 

/ viewが一覧ページimage.png

 

/ view / test1などでアクセス

image.png教材

https://www.udemy.com/course/go-fintech/learn/lecture/12088980

<スポンサーリンク>

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)