Files
hiroyuki eguchi 8d18c54f7c fix indent
2016-01-09 17:04:45 +09:00

67 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3.2 Goで簡単なWebサーバを立てる
前の節でWebはhttpプロトコルに基づいたサービスであるとご紹介しました。Go言語では完全なnet/httpパッケージを提供しています。httpパッケージを通して実行できるWebサービスを非常に簡単に立ち上げる事ができます。同時にこのパッケージを使用することで、簡単にWebのルーティング、静的なファイル、テンプレート、cookie等のデータに対して設定と操作を行うことができます。
## httpパッケージでWebサーバを立てる
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //オプションを解析します。デフォルトでは解析しません。
fmt.Println(r.Form) //このデータはサーバのプリント情報に出力されます。
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") //ここでwに入るものがクライアントに出力されます。
}
func main() {
http.HandleFunc("/", sayhelloName) //アクセスのルーティングを設定します。
err := http.ListenAndServe(":9090", nil) //監視するポートを設定します。
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
上のコードはbuildした後、web.exeを実行した際、9090ポートでhttpリンクリクエストを監視します。
ブラウザで`http://localhost:9090`を入力してください。
ブラウザで`Hello astaxie!`と出力されたのが見えたかと思います。
アドレスを変えて試してみましょう:`http://localhost:9090/?url_long=111&url_long=222`
ブラウザで出力されたものは何でしょうか。サーバは何と出力していますか?
サーバで出力される情報は以下の通りです:
![](images/3.2.goweb.png?raw=true)
図3.8 ユーザがWebにアクセスしてサーバが出力する情報
上のコードでWebサーバを書くためにはhttpパッケージのつの関数を呼ぶだけで良いことがわかります。
>もしあなたが以前PHPプログラマであれば。こう問うかもしれません。我々のnginx、apacheサーバは必要ないのですかとなぜならこいつは直接tcpポートを監視しますので、nginxがやることをやってくれます。またsayhelloNameは実は我々が書いたロジック関数ですので、phpの中のコントローラcontroller関数に近いものです。
>もしあなたがPythonプログラマであったのなら、tornadoを聞いたことがあると思います。このコードはそれとよく似ていませんかええ、その通りです。GoはPythonのような動的な言語によく似た特性を持っています。Webアプリケーションを書くにはとても便利です。
>もしあなたがRubyプログラマであったのなら、RORの/script/serverを起動したのと少し似ている事に気づいたかもしれません。
Goを通じて簡単な数行のコードでwebサーバを立ち上げることができました。さらにこのWebサーバの内部ではマルチスレッドの特性をサポートしています。続くつの節でGoが如何にWebのマルチスレッドを実現しているのか細かくご紹介します。
## links
* [目次](<preface.md>)
* 前へ: [Webの作業方法](<03.1.md>)
* 次へ: [Goはどのようにしてweb作業を行うか](<03.3.md>)