株式会社ヴァンデミックシステム

Blog

<スポンサーリンク>

構造化された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

<スポンサーリンク>

コメントを残す

Allowed tags:  you may use these HTML tags and attributes: <a href="">, <strong>, <em>, <h1>, <h2>, <h3>
Please note:  all comments go through moderation.

*

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