Slide 1

Slide 1 text

Gunosy.go  #6 net/h0p  +  net/url  

Slide 2

Slide 2 text

自己紹介 •  印南 聡志  (いんなみ さとし)   •  6月にGunosyに入社   •  h0ps://github.com/satoshi03   •  Java/Ruby  …  最近  Python/Go  始めました    

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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)

Slide 5

Slide 5 text

Package  net Server Client Listen() Accept() Dial() Write() Read() Write() Read()

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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”)  

Slide 8

Slide 8 text

net  server •  Func  Accept(network,  address  string)  (Conn,  error)   –  クライアントからの接続を受諾し、Connオブジェクトを返信   –  network  :  “tcp”,  “tcp4”,  “tcp6”,  “unix”,  “unixpacket”   •  指定可能  :  stream  orientedなもの   •  それ以外 : エラー  

Slide 9

Slide 9 text

Demo

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Package  h0p   h0p.Server h0p.Handler h0p.Client ListenAndServe   :80 GET/POST/HEAD

Slide 12

Slide 12 text

h0p  server •  type  Server     type  Server  struct  {              Addr                                            string              Handler                                  Handler              ReadTimeout              Fme.DuraFon              WriteTimeout            Fme.DuraFon              MaxHeaderBytes    int              TLSConfig                              *tls.Confis   }

Slide 13

Slide 13 text

h0p  server func  ListenAndServe(addr  string,  handler  Handler)   error   – 指定したアドレス、ハンドラーを使用してサーバー を起動   type  Handler  interface  {                  ServeHTTP(ResponseWriter,  *Request)   }  

Slide 14

Slide 14 text

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)                                                                               }  

Slide 15

Slide 15 text

Package  h0p   h0p.Server h0p.Handler h0p.Handler h0p.Handler h0p.Client ListenAndServe   :80 GET/POST/HEAD h0p.ServeMux

Slide 16

Slide 16 text

h0p  server •  func  Handle(pa0ern  string,  handler  Handler)   –  指定したパターンでハンドラーを追加   •  func  HandleFunc(pa0ern  string,  handler    func(ResponseWriter,  *Request))   –  指定したパターンでファンクションハンドラーを追加  

Slide 17

Slide 17 text

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)                                                                                           }

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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)

Slide 20

Slide 20 text

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"}})  

Slide 21

Slide 21 text

Package  url •  URLを管理するパッケージ   – URLのパース   – クエリーのエスケープ処理

Slide 22

Slide 22 text

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]

Slide 23

Slide 23 text

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    

Slide 24

Slide 24 text

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  

Slide 25

Slide 25 text

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