Your SlideShare is downloading. ×
0
Go言語で作るWebアプリ- RESTful APIを作ろう -2013/4/13(Sat.)@GoCon 2013 spring
自己紹介上田拓也新卒1年目twitter : @tenntennblog: http://u.hinoichi.net
目標と対象【目標】● net/httpパッケージを知る● gowebの基本的な使い方を知る【対象】● Go言語初心者● goweb知らない人
アジェンダ● Webサーバを作ろう  ○ net/httpパッケージ● RESTful APIを作ろう  ○ RESTful APIとは?  ○ gowebの使い方● おまけ
Webサーバを作ろう
はじめに● ドキュメントを軽く見ながら聞いて下さい  ○ http://golang.org/pkg/net/http  ○ http://godoc.org/github.    com/stretchrcom/goweb/goweb
Go言語でhttpリクエストをハンドル                http.Server           http.Handler       80番ポート                ListenAndServe ハンドル     ...
http.Server型type Server struct {   Addr                string   Handler             Handler   ReadTimeout             time...
http.Server型● type Server struct  ○ func (srv *Server) ListenAndServe() error  ○ func (srv *Server) ListenAndServeTLS(cert...
http.Handler型type Handler interface {   ServeHTTP(ResponseWriter, *Request)}
複数のハンドラを設定する                                                     http.Handler                                        aa   ...
http.ServeMux型type struct ServeMux{}// 指定したパタンでハンドラを登録func (mux *ServeMux) Handle(pattern string,handler Handler)// 指定したパタ...
http.Handleの実装めんどい● ServeMux.HandleFuncを使えばいい● HandlerFuncを使って、関数にhttp.Handlerを  実装させている
http.HandlerFunc型type HandlerFunc func(ResponseWriter,*Request)// src/pkg/net/http/server.goで実装// http.Handlerを実装func (f H...
http.ServeMux作るのめんどい● http.DefaultServeMuxというグローバル変数  がある● http.Handleやhttp.HandleFuncはhttp.  DefaultServeMuxのメソッドのラッパー● ハ...
簡単な例:hello, http!! func main() {    f := func(w http.ResponseWriter, r *http. Request) {        fmt.Fprintf(w, "hello, htt...
簡単な例:静的ファイルfunc main() {    // static以下のファイルを提供    http.Handle("/", http.FileServer(http.Dir("static")))    http.ListenAnd...
DEMO1
RESTful APIを作ろう
RESTful APIとは?● 明示的にHTTPメソッドを使う ○ POST, GET, PUT, DELETE ○ CRUDと対応● ステートレスにする ○ 状態を保存しない● ディレクトリ構造に似たURI ○ /api/persons/10...
Go言語でRESTful APIを作る● URIだけではなく、httpのメソッドでも分岐したい● JSONやXMLで来たリクエストを簡単にオブジェ  クトにしたい● JSONやXMLでレスポンスを返すのを簡単にし  たい  GoWebがあるよ!
GoWebってなに?● RESTful APIを作るためのライブラリ  ○ https://github.com/stretchrcom/goweb● 細かいルーティング管理できる● Controllerを作り、POST, GET, PUT, ...
GoWebの構造                     DefaultRouteManager   :HttpHandler         :RouteManager                                     ...
GoWebの簡単な使い方 func main() {    handler := func(c *goweb.Context) {       name := c.PathParams["name"]       animal := c.Pat...
GoWebの簡単な使い方 RESTful API// REST用のコントローラーtype MyController struct {} HTTPメソッド      URI例            実装するメソッドPOST        /api...
GoWebの簡単な使い方 RESTful API// POSTをハンドリングするfunc (cr *MyController) Create(cx*goweb.Context) {      fmt.Fprintf(cx.ResponseWri...
GoWebの簡単な使い方 RESTful API// GETをハンドリング(id指定)func (cr *MyController) Read(id string, cx *goweb.Context) {      fmt.Fprintf(c...
GoWebの簡単な使い方 RESTful API// PUTをハンドリング(id指定)func (cr *MyController) Update(id string, cx*goweb.Context) {      fmt.Fprintf(...
GoWebの簡単な使い方 RESTful API// DELETEをハンドリング(id指定)func (cr *MyController) Delete(id string, cx*goweb.Context) {      fmt.Fprin...
GoWebの簡単な使い方 RESTful APIfunc main() {  controller := new(MyController)  goweb.MapRest("/api", controller)  goweb.ListenAnd...
DEMO2
まとめ● Go言語でWebサーバ作るの簡単! ○ net/httpパッケージを使う● gowebを使えばRESTful API作るの簡単! ○ 各HTTPメソッドとURIに対応したメソッドを実装
話きれなかったこと● テンプレートエンジン  ○ html/template, text/template● テスト  ○ net/http/httptest● FastCGI  ○ net/http/fcgi  ○ nginxなどで使用● g...
おまけ
Go言語のサンプル置き場● https://github.com/golang-samples● みんなでサンプルを増やそう!  ○ すでにあるパッケージはフォークしてもOK!  ○ メンバーに加わって、新たにパッケージを追加しても    OK!
Go言語が使えるエディタ/IDE●   https://code.google.com/p/go-    wiki/wiki/IDEsAndTextEditorPlugin    s●   Vim●   Emacs●   Sublime Tex...
ご清聴ありがとうございました
Upcoming SlideShare
Loading in...5
×

Go言語で作る webアプリ@gocon 2013 spring

3,632

Published on

Published in: Technology
0 Comments
24 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,632
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
24
Comments
0
Likes
24
Embeds 0
No embeds

No notes for slide

Transcript of "Go言語で作る webアプリ@gocon 2013 spring"

  1. 1. Go言語で作るWebアプリ- RESTful APIを作ろう -2013/4/13(Sat.)@GoCon 2013 spring
  2. 2. 自己紹介上田拓也新卒1年目twitter : @tenntennblog: http://u.hinoichi.net
  3. 3. 目標と対象【目標】● net/httpパッケージを知る● gowebの基本的な使い方を知る【対象】● Go言語初心者● goweb知らない人
  4. 4. アジェンダ● Webサーバを作ろう ○ net/httpパッケージ● RESTful APIを作ろう ○ RESTful APIとは? ○ gowebの使い方● おまけ
  5. 5. Webサーバを作ろう
  6. 6. はじめに● ドキュメントを軽く見ながら聞いて下さい ○ http://golang.org/pkg/net/http ○ http://godoc.org/github. com/stretchrcom/goweb/goweb
  7. 7. Go言語でhttpリクエストをハンドル http.Server http.Handler 80番ポート ListenAndServe ハンドル @80ポートブラウザクライアントサイド サーバサイド
  8. 8. http.Server型type Server struct { Addr string Handler Handler ReadTimeout time.Duration WriteTimeout time.Duration MaxHeaderBytes int TLSConfig *tls.Config}
  9. 9. http.Server型● type Server struct ○ func (srv *Server) ListenAndServe() error ○ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error ○ func (srv *Server) Serve(l net.Listener) error
  10. 10. http.Handler型type Handler interface { ServeHTTP(ResponseWriter, *Request)}
  11. 11. 複数のハンドラを設定する http.Handler aa /a http.Handler bhttp.Server http.ServeMux /bbListenAndServe ハンドル@80ポート /zzz http.Handler
  12. 12. http.ServeMux型type struct ServeMux{}// 指定したパタンでハンドラを登録func (mux *ServeMux) Handle(pattern string,handler Handler)// 指定したパタンでハンドラ関数を登録func (mux *ServeMux) HandleFunc(patternstring, handler func(ResponseWriter, *Request)// http.Handlerの実装func (mux *ServeMux) ServeHTTP(wResponseWriter, r *Request)
  13. 13. http.Handleの実装めんどい● ServeMux.HandleFuncを使えばいい● HandlerFuncを使って、関数にhttp.Handlerを 実装させている
  14. 14. http.HandlerFunc型type HandlerFunc func(ResponseWriter,*Request)// src/pkg/net/http/server.goで実装// http.Handlerを実装func (f HandlerFunc) ServeHTTP(wResponseWriter, r *Request) { f(w, r)}
  15. 15. http.ServeMux作るのめんどい● http.DefaultServeMuxというグローバル変数 がある● http.Handleやhttp.HandleFuncはhttp. DefaultServeMuxのメソッドのラッパー● ハンドラが明示されないと、http. DefaultServerMuxが使用される
  16. 16. 簡単な例:hello, http!! func main() { f := func(w http.ResponseWriter, r *http. Request) { fmt.Fprintf(w, "hello, http!!") } http.HandleFunc("/", f) http.ListenAndServe(":8080", nil) }https://github.com/golang-samples/http/tree/master/handlefunc
  17. 17. 簡単な例:静的ファイルfunc main() { // static以下のファイルを提供 http.Handle("/", http.FileServer(http.Dir("static"))) http.ListenAndServe(":8080", nil)}https://github.com/golang-samples/http/tree/master/fileserv
  18. 18. DEMO1
  19. 19. RESTful APIを作ろう
  20. 20. RESTful APIとは?● 明示的にHTTPメソッドを使う ○ POST, GET, PUT, DELETE ○ CRUDと対応● ステートレスにする ○ 状態を保存しない● ディレクトリ構造に似たURI ○ /api/persons/10● XML、JSONなどを転送する ○ リクエストやレスポンスにXMLやJSONを使用
  21. 21. Go言語でRESTful APIを作る● URIだけではなく、httpのメソッドでも分岐したい● JSONやXMLで来たリクエストを簡単にオブジェ クトにしたい● JSONやXMLでレスポンスを返すのを簡単にし たい GoWebがあるよ!
  22. 22. GoWebってなに?● RESTful APIを作るためのライブラリ ○ https://github.com/stretchrcom/goweb● 細かいルーティング管理できる● Controllerを作り、POST, GET, PUT, DELETE などの単位でハンドリング● JSONやXMLをリクエストから作れる● レスポンスを簡単に作れる ○ 良く使うステータスコード ○ JSONやXML
  23. 23. GoWebの構造 DefaultRouteManager :HttpHandler :RouteManager :ControllerServeHTTP GetMathingRoute() routes loop:routes if:route.DoesMatchContext route.Controller.HandleRequest()
  24. 24. GoWebの簡単な使い方 func main() { handler := func(c *goweb.Context) { name := c.PathParams["name"] animal := c.PathParams["animal"] fmt.Fprintf(c.ResponseWriter, "Hey %s, your favorite animal is a %s", name, animal) } goweb.MapFunc("/people/{name}/animals/ {animal}", handler) goweb.ListenAndServe(":8080") }https://github.com/golang-samples/goweb/tree/master/mapfunc
  25. 25. GoWebの簡単な使い方 RESTful API// REST用のコントローラーtype MyController struct {} HTTPメソッド URI例 実装するメソッドPOST /api/ RestCreater.CreateGET /api/ RestManyReader.ReadManyGET /api/123 RestReader.ReadPUT /api/ RestManyUpdater.UpdateManyPUT /api/123 RestUpdater.UpdateDELETE /api/ RestManyDeleter.DeleteManyDELETE /api/123 RestDeleter.Delete※必要なものだけ、実装する
  26. 26. GoWebの簡単な使い方 RESTful API// POSTをハンドリングするfunc (cr *MyController) Create(cx*goweb.Context) { fmt.Fprintf(cx.ResponseWriter,"Create new resource")}
  27. 27. GoWebの簡単な使い方 RESTful API// GETをハンドリング(id指定)func (cr *MyController) Read(id string, cx *goweb.Context) { fmt.Fprintf(cx.ResponseWriter, "Readresource %s", id)}// GETをハンドリング(id指定なし)func (cr *MyController) ReadMany(cx *goweb.Context) { fmt.Fprintf(cx.ResponseWriter, "Read manyresources")}
  28. 28. GoWebの簡単な使い方 RESTful API// PUTをハンドリング(id指定)func (cr *MyController) Update(id string, cx*goweb.Context) { fmt.Fprintf(cx.ResponseWriter, "Updateresource %s", id)}// PUTをハンドリング(id指定なし)func (cr *MyController) UpdateMany(cx *goweb.Context) { fmt.Fprintf(cx.ResponseWriter, "Updatemany resources")}
  29. 29. GoWebの簡単な使い方 RESTful API// DELETEをハンドリング(id指定)func (cr *MyController) Delete(id string, cx*goweb.Context) { fmt.Fprintf(cx.ResponseWriter, "Deleteresource %s", id)}// DELETEをハンドリング(id指定なし)func (cr *MyController) DeleteMany(cx *goweb.Context) { fmt.Fprintf(cx.ResponseWriter, "Delete manyresources")}
  30. 30. GoWebの簡単な使い方 RESTful APIfunc main() { controller := new(MyController) goweb.MapRest("/api", controller) goweb.ListenAndServe(":8080")}https://github.com/golang-samples/goweb/tree/master/rest
  31. 31. DEMO2
  32. 32. まとめ● Go言語でWebサーバ作るの簡単! ○ net/httpパッケージを使う● gowebを使えばRESTful API作るの簡単! ○ 各HTTPメソッドとURIに対応したメソッドを実装
  33. 33. 話きれなかったこと● テンプレートエンジン ○ html/template, text/template● テスト ○ net/http/httptest● FastCGI ○ net/http/fcgi ○ nginxなどで使用● gowebの具体的な使用例 ○ AngularJSから使う ○ https://github.com/golang- samples/goweb/tree/master/diary
  34. 34. おまけ
  35. 35. Go言語のサンプル置き場● https://github.com/golang-samples● みんなでサンプルを増やそう! ○ すでにあるパッケージはフォークしてもOK! ○ メンバーに加わって、新たにパッケージを追加しても OK!
  36. 36. Go言語が使えるエディタ/IDE● https://code.google.com/p/go- wiki/wiki/IDEsAndTextEditorPlugin s● Vim● Emacs● Sublime Text● LiteIDE● Goclipse(Eclipse)● Goworks(Netbeans)
  37. 37. ご清聴ありがとうございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×