• Like
Go言語で作る webアプリ@gocon 2013 spring
Upcoming SlideShare
Loading in...5
×

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

  • 2,770 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,770
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
14
Comments
0
Likes
17

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Go言語で作るWebアプリ- RESTful APIを作ろう -2013/4/13(Sat.)@GoCon 2013 spring
  • 2. 自己紹介上田拓也新卒1年目twitter : @tenntennblog: http://u.hinoichi.net
  • 3. 目標と対象【目標】● net/httpパッケージを知る● gowebの基本的な使い方を知る【対象】● Go言語初心者● goweb知らない人
  • 4. アジェンダ● Webサーバを作ろう ○ net/httpパッケージ● RESTful APIを作ろう ○ RESTful APIとは? ○ gowebの使い方● おまけ
  • 5. Webサーバを作ろう
  • 6. はじめに● ドキュメントを軽く見ながら聞いて下さい ○ http://golang.org/pkg/net/http ○ http://godoc.org/github. com/stretchrcom/goweb/goweb
  • 7. Go言語でhttpリクエストをハンドル http.Server http.Handler 80番ポート ListenAndServe ハンドル @80ポートブラウザクライアントサイド サーバサイド
  • 8. http.Server型type Server struct { Addr string Handler Handler ReadTimeout time.Duration WriteTimeout time.Duration MaxHeaderBytes int TLSConfig *tls.Config}
  • 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. http.Handler型type Handler interface { ServeHTTP(ResponseWriter, *Request)}
  • 11. 複数のハンドラを設定する http.Handler aa /a http.Handler bhttp.Server http.ServeMux /bbListenAndServe ハンドル@80ポート /zzz http.Handler
  • 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. http.Handleの実装めんどい● ServeMux.HandleFuncを使えばいい● HandlerFuncを使って、関数にhttp.Handlerを 実装させている
  • 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. http.ServeMux作るのめんどい● http.DefaultServeMuxというグローバル変数 がある● http.Handleやhttp.HandleFuncはhttp. DefaultServeMuxのメソッドのラッパー● ハンドラが明示されないと、http. DefaultServerMuxが使用される
  • 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. 簡単な例:静的ファイルfunc main() { // static以下のファイルを提供 http.Handle("/", http.FileServer(http.Dir("static"))) http.ListenAndServe(":8080", nil)}https://github.com/golang-samples/http/tree/master/fileserv
  • 18. DEMO1
  • 19. RESTful APIを作ろう
  • 20. RESTful APIとは?● 明示的にHTTPメソッドを使う ○ POST, GET, PUT, DELETE ○ CRUDと対応● ステートレスにする ○ 状態を保存しない● ディレクトリ構造に似たURI ○ /api/persons/10● XML、JSONなどを転送する ○ リクエストやレスポンスにXMLやJSONを使用
  • 21. Go言語でRESTful APIを作る● URIだけではなく、httpのメソッドでも分岐したい● JSONやXMLで来たリクエストを簡単にオブジェ クトにしたい● JSONやXMLでレスポンスを返すのを簡単にし たい GoWebがあるよ!
  • 22. GoWebってなに?● RESTful APIを作るためのライブラリ ○ https://github.com/stretchrcom/goweb● 細かいルーティング管理できる● Controllerを作り、POST, GET, PUT, DELETE などの単位でハンドリング● JSONやXMLをリクエストから作れる● レスポンスを簡単に作れる ○ 良く使うステータスコード ○ JSONやXML
  • 23. GoWebの構造 DefaultRouteManager :HttpHandler :RouteManager :ControllerServeHTTP GetMathingRoute() routes loop:routes if:route.DoesMatchContext route.Controller.HandleRequest()
  • 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. 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. GoWebの簡単な使い方 RESTful API// POSTをハンドリングするfunc (cr *MyController) Create(cx*goweb.Context) { fmt.Fprintf(cx.ResponseWriter,"Create new resource")}
  • 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. 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. 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. GoWebの簡単な使い方 RESTful APIfunc main() { controller := new(MyController) goweb.MapRest("/api", controller) goweb.ListenAndServe(":8080")}https://github.com/golang-samples/goweb/tree/master/rest
  • 31. DEMO2
  • 32. まとめ● Go言語でWebサーバ作るの簡単! ○ net/httpパッケージを使う● gowebを使えばRESTful API作るの簡単! ○ 各HTTPメソッドとURIに対応したメソッドを実装
  • 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. おまけ
  • 35. Go言語のサンプル置き場● https://github.com/golang-samples● みんなでサンプルを増やそう! ○ すでにあるパッケージはフォークしてもOK! ○ メンバーに加わって、新たにパッケージを追加しても OK!
  • 36. Go言語が使えるエディタ/IDE● https://code.google.com/p/go- wiki/wiki/IDEsAndTextEditorPlugin s● Vim● Emacs● Sublime Text● LiteIDE● Goclipse(Eclipse)● Goworks(Netbeans)
  • 37. ご清聴ありがとうございました