Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gunosy Go Lang Study #6 net net/http net/url

Gunosy Go Lang Study #6 net net/http net/url

Go lang study
net, net/http, net/urlの説明資料

Satoshi

July 16, 2014
Tweet

More Decks by Satoshi

Other Decks in Programming

Transcript

  1. 自己紹介 •  印南 聡志  (いんなみ さとし)   •  6月にGunosyに入社  

    •  h0ps://github.com/satoshi03   •  Java/Ruby  …  最近  Python/Go  始めました    
  2. Package  net/h0p  +  net/url •  net   •  net/h0p  

    – cgi   – cookiejar   – h0ptest   – h0puFl   – pprof   •  net/url   物理層 データリンク層 ネットワーク層  (IP) トランスポート層(TCP/UDP) アプリケーション層  (HTTP)
  3. Package  net •  Package  net  provides  a  portable  interface  for

      network  I/O,  including  TCP/IP,  UDP,  domain  name   resoluFon,  and  Unix  domain  sockets.   •  比較的低レイヤーの通信を実現   物理層 データリンク層 ネットワーク層  (IP) トランスポート層(TCP/UDP) アプリケーション層  (HTTP)
  4. net  server •  func  Listen(network,  laddr  string)  (Listener,  error)  

    –  クライアントからのコネクションするための接続口を作成   –  laddr  :  ローカルアドレス   –  network  :  “tcp”,  “tcp4”,  “tcp6”,  “unix”,  “unixpacket”   •  指定可能  :  stream  orientedなもの   •  それ以外 : エラー   – Example  :   •  Listen(“tcp”  “:8080”)  
  5. net  client •  func  Dial(network,  address  string)  (Conn,  error)  

    –  指定したアドレスにnetworkで指定した方法(≒Protocol)で 接続   –  Network  に指定する値     •  tcp,  tcp4,  tcp6m  udp,  udp4,  udp6,  ip,  ip4,  ip6,  unix,  unixgram,   unixpacket   –  Examples   •  Dial(“tcp”,  “12.34.56.78:80”)   •  Dial(“tcp”,  “google.com:h0p”)   •  Dial(“tcp”,  “[2001:db8::1]:h0p”)   •  Dial(“tcp”,  “[fe80::1%lo0]:80”)  
  6. net  server •  Func  Accept(network,  address  string)  (Conn,  error)  

    –  クライアントからの接続を受諾し、Connオブジェクトを返信   –  network  :  “tcp”,  “tcp4”,  “tcp6”,  “unix”,  “unixpacket”   •  指定可能  :  stream  orientedなもの   •  それ以外 : エラー  
  7. Package  h0p •  Package  h0p  provides  HTTP  client  and  server

      implementaFons.   物理層 データリンク層 ネットワーク層  (IP) トランスポート層(TCP/UDP) アプリケーション層  (HTTP)
  8. h0p  server •  type  Server     type  Server  struct

     {              Addr                                            string              Handler                                  Handler              ReadTimeout              Fme.DuraFon              WriteTimeout            Fme.DuraFon              MaxHeaderBytes    int              TLSConfig                              *tls.Confis   }
  9. h0p  server func  ListenAndServe(addr  string,  handler  Handler)   error  

    – 指定したアドレス、ハンドラーを使用してサーバー を起動   type  Handler  interface  {                  ServeHTTP(ResponseWriter,  *Request)   }  
  10. h0p  server  demo   type  AppHandler  struct  {    

                                                                                                                 }                                                                                                                                                                                                                                                                                                                           func(index  *AppHandler)  ServeHTTP(w   h0p.ResponseWriter,  r  *h0p.Request)  {              fmt.Fprinl(w,    »hello  world  »)   }   func  main()  {                                                                                                                                        index  :=  new(AppHandler)                                                                                                  h0p.ListenAndServe(":8080",  index)                                                                               }  
  11. h0p  server •  func  Handle(pa0ern  string,  handler  Handler)   – 

    指定したパターンでハンドラーを追加   •  func  HandleFunc(pa0ern  string,  handler    func(ResponseWriter,  *Request))   –  指定したパターンでファンクションハンドラーを追加  
  12. h0p  server  demo   type  IndexHandler  struct  {    

                                                                                                          }                                                                                                                                                                                                                                                                                                                               func(index  *IndexHandler)  ServeHTTP(w  h0p.ResponseWriter,  r  *h0p.Request)  {          fmt.Fprinl(w,  "This  is  index  page.”)     }   type  DetailHandler  struct  {                                                                                                             }                                                                                                                                                                                                                                                                                                                           func(index  *DetailHandler)  ServeHTTP(w  h0p.ResponseWriter,  r  *h0p.Request)  {          fmt.Fprinl(w,  "This  is  detail  page.")↲                                                                               }                                                                                                                                                                                                                                                                                                                                           func  main()  {                                                                                                                                                index  :=  new(IndexHandler)↲                                                                                                                  detail  :=  new(DetailHandler)↲                                                                                                  h0p.Handle("/",  index)                                                                                                                  h0p.Handle("/detail",  detail)                                                                                                      h0p.ListenAndServe(":8080",  nil)                                                                                           }
  13. h0p  client  (1/3) •  func  (c  *Client)  Get(url  string)  (resp

     *Response,  err   error)   –  指定したURLに対してGETリクエストを送信してレスポンス を取得   –  url  :  URL文字列  
  14. h0p  client(2/3) •  func  (c  *Client)  Post(url  string,  bodyType  string,

     body   io.Reader)  (resp  *Response,  err  error)   –  指定したURLに対してPOSTリクエストを送信   –  url  :  url文字列   –  bodyType  :  post時に送信するバイト列の種類   –  body  :  送信するバイト列   –  Example:   •  resp,  err  :=  h0p.Post(“h0p://example.com/upload",   "image/jpeg",  &buf)
  15. h0p  client(3/3) •  func  (c  *Client)  PostForm(url  string,  data  url.Values)

      (resp  *Response,  err  error)   –  Key  Value形式でPOSTリクエストを送信   –  url  :  url文字列   –  data  :  key  value形式のデータ   •  Example   –  resp,  err  :=  h0p.PostForm("h0p://example.com/form",      url.Values{"key":  {"Value"},  "id":  {"123"}})  
  16. type  url type  URL  struct  {        

             Scheme      string                  Opaque      string        //  encoded  opaque  data                  User          *Userinfo  //  username  and  password  informaFon                  Host          string        //  host  or  host:port                  Path          string                  RawQuery  string  //  encoded  query  values,  without  '?'                  Fragment  string  //  fragment  for  references,  without  '#'   } scheme://[userinfo@]host/path[?query][#fragment]
  17. url •  func  Parse(rawurl  string)  (url  *URL,  err  error)  

    –  URL文字列をパースしてURLオブジェクトを取得   u,  err  :=  url.Parse("h0p://bing.com/search?q=dotnet")   if  err  !=  nil  {    log.Fatal(err)   }   u.Scheme  =  "h0ps”   u.Host  =  "google.com”   q  :=  u.Query()   q.Set("q",  "golang")   u.RawQuery  =  q.Encode()   fmt.Println(u) >  h0ps://google.com/search?q=golang h0p://play.golang.org/p/8Id1F0vfvD    
  18. url •  QueryEscape(s  string)  string   –  クエリーの文字列のエスケープに変換   • 

    QueryUnescape(s  string)  (string,  error)   –  エスケープされたクエリーを文字列に変換 escaped_url  :=  url.QueryEscape(h0p://bing.com/search?q=test)   fmt.Println("escaped_url  :  "  +  escaped_url)   unescaped_url,  err  :=  url.QueryUnescape(escaped_url)   if  err  !=  nil  {    log.Fatal(err)   }   fmt.Println("escaped_url  :  "  +  unescaped_url)   escaped_url  :  h0p%3A%2F%2Fbing.com%2Fsearch%3Fq%3Dtest   escaped_url  :  h0p://bing.com/search?q=test   h0p://play.golang.org/p/-­‐jZzlqHdXm  
  19. Package  net •  net   •  net/h0p   – cgi  

    – cookiejar   – h0ptest   – h0puFl   – pprof   •  net/url   物理層 データリンク層 ネットワーク層  (IP) トランスポート層(TCP/UDP) アプリケーション層  (HTTP)