Created
November 13, 2009 17:39
-
-
Save hidenorigoto/234013 to your computer and use it in GitHub Desktop.
golang CGI form sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import( | |
"io"; | |
"fmt"; | |
"bytes"; | |
"template"; | |
"os"; | |
"strings"; | |
"strconv"; | |
"http"; | |
) | |
/* | |
* テンプレートのパラメータ受け渡し用のinterface | |
*/ | |
type S struct { | |
name string; | |
title string; | |
} | |
/* | |
* メイン処理 | |
*/ | |
func main(){ | |
// テンプレートを読み込む。 | |
var tmpl *template.Template; | |
tmpl = loadTemplate("sample.tpl"); | |
if tmpl == nil { | |
outputData("テンプレートの読み込みに失敗しました。"); | |
return; | |
} | |
// HTTPパラメータを取得する。 | |
params, param_len := getPostData(); | |
// データを準備する。 | |
s := new(S); | |
s.title = "Go Template サンプル2"; | |
s.name = "Go"; | |
if param_len > 0 { | |
if params["yourname"] != "" { | |
s.name = params["yourname"]; | |
} | |
} | |
// テンプレートにデータを埋め込む。 | |
output := applyTemplate(tmpl, s); | |
// 表示する。 | |
outputData(output); | |
} | |
/* | |
* テンプレートを読み込む | |
*/ | |
func loadTemplate(path string) (tmpl *template.Template) { | |
var filedata []byte; | |
var err os.Error; | |
// 指定したパスのファイルを読み込む。 | |
filedata, err = io.ReadFile(path); | |
if err != nil { | |
return nil; | |
} | |
// テンプレートとしてパースする。 | |
tmpl, err = template.Parse(bytes.NewBuffer(filedata).String(), nil); | |
if err != nil { | |
return nil; | |
} | |
return tmpl; | |
} | |
/* | |
* テンプレートにデータを適用する | |
*/ | |
func applyTemplate(tmpl *template.Template, params interface{}) (ret string) { | |
var buf bytes.Buffer; | |
// 適用する。 | |
err := tmpl.Execute(params, &buf); | |
if err != nil { | |
return ""; | |
} | |
return buf.String(); | |
} | |
/* | |
* HTTPレスポンスを返す | |
*/ | |
func outputData(body string) { | |
fmt.Print("Content-type: text/html; charset=UTF-8\n\n"); | |
fmt.Print(body); | |
} | |
/* | |
* HTTP POSTデータを解析する | |
*/ | |
func getPostData() (params map[string] string, param_num int) { | |
// データが送信されていなければ何もしない。 | |
content_length, _ := strconv.Atoi(os.Getenv("CONTENT_LENGTH")); | |
if content_length == 0 { | |
return nil, 0; | |
} | |
// 標準入力から読み込む。 | |
var buf [1024]byte; | |
_, err := os.Stdin.Read(&buf); | |
if err != nil { | |
return nil, 0; | |
} | |
// 読み込んだデータを文字列に変換する。 | |
// バッファサイズより短い場合は切りつめる。 | |
buffer := bytes.NewBuffer(&buf); | |
if content_length < 1024 { | |
buffer.Truncate(content_length); | |
} | |
var data = buffer.String(); | |
// パラメータ用のmapを初期化する。 | |
params = make(map[string]string); | |
// 読み込んだデータをマップに変換する。 | |
var pairs = strings.Split(data, "&", 0); | |
for _, v1 := range pairs { | |
var pair = strings.Split(v1, "=", 0); | |
if len(pair) > 0 { | |
for i, v2 := range pair { | |
// URLエンコードを解除 | |
pair[i], _ = http.URLUnescape(v2); | |
} | |
params[pair[0]] = pair[1]; | |
} | |
} | |
return params, len(params); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head><title>{title|html}</title></head> | |
<body> | |
<h1>CGIでGOサンプル2</h1> | |
<br /> | |
Goでテンプレートを使ってフォームを表示し、POSTされたデータを受け取るサンプルです。 | |
<br /> | |
<br /> | |
<h1>こんにちは、{name|html}さん!</h1> | |
<br /> | |
<form action="" method="post"> | |
<input type="text" name="yourname" size="20" maxlength="20" value="{name|html}" /> | |
<input type="submit" name="送信" value="送信" /> | |
</form> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment