Gunosy Go lang study #6 net http url

13,867 views

Published on

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

Published in: Technology
  • Be the first to comment

Gunosy Go lang study #6 net http url

  1. 1. Gunosy.go #6 net/http + net/url
  2. 2. 自己紹介 • 印南 聡志 (いんなみ さとし) • 6月にGunosyに入社 • https://github.com/satoshi03 • Java/Ruby … 最近 Python/Go 始めました
  3. 3. Package net/http + net/url • net • net/http – cgi – cookiejar – httptest – httputil – pprof • net/url 物理層 データリンク層 ネットワーク層 (IP) トランスポート層(TCP/UDP) アプリケーション層 (HTTP)
  4. 4. Package net • Package net provides a portable interface for network I/O, including TCP/IP, UDP, domain name resolution, and Unix domain sockets. • 比較的低レイヤーの通信を実現 物理層 データリンク層 ネットワーク層 (IP) トランスポート層(TCP/UDP) アプリケーション層 (HTTP)
  5. 5. Package net Server Client Listen() Accept() Dial() Write() Read() Write() Read()
  6. 6. net server • func Listen(network, laddr string) (Listener, error) – クライアントからのコネクションするための接続口を作成 – laddr : ローカルアドレス – network : “tcp”, “tcp4”, “tcp6”, “unix”, “unixpacket” • 指定可能 : stream orientedなもの • それ以外 : エラー – Example : • Listen(“tcp” “:8080”)
  7. 7. 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:http”) • Dial(“tcp”, “[2001:db8::1]:http”) • Dial(“tcp”, “[fe80::1%lo0]:80”)
  8. 8. net server • Func Accept(network, address string) (Conn, error) – クライアントからの接続を受諾し、Connオブジェクトを返信 – network : “tcp”, “tcp4”, “tcp6”, “unix”, “unixpacket” • 指定可能 : stream orientedなもの • それ以外 : エラー
  9. 9. Demo
  10. 10. Package http • Package http provides HTTP client and server implementations. 物理層 データリンク層 ネットワーク層 (IP) トランスポート層(TCP/UDP) アプリケーション層 (HTTP)
  11. 11. Package http http.Server http.Handler http.Client ListenAndServe :80 GET/POST/HEAD
  12. 12. http server • type Server type Server struct { Addr string Handler Handler ReadTimeout time.Duration WriteTimeout time.Duration MaxHeaderBytes int TLSConfig *tls.Confis }
  13. 13. http server func ListenAndServe(addr string, handler Handler) error – 指定したアドレス、ハンドラーを使用してサーバー を起動 type Handler interface { ServeHTTP(ResponseWriter, *Request) }
  14. 14. http server demo type AppHandler struct { } func(index *AppHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, »hello world ») } func main() { index := new(AppHandler) http.ListenAndServe(":8080", index) }
  15. 15. Package http http.Server http.Handler http.Handler http.Handler http.Client ListenAndServe :80 GET/POST/HEAD http.ServeMux
  16. 16. http server • func Handle(pattern string, handler Handler) – 指定したパターンでハンドラーを追加 • func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) – 指定したパターンでファンクションハンドラーを追加
  17. 17. http server demo type IndexHandler struct { } func(index *IndexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "This is index page.”) } type DetailHandler struct { } func(index *DetailHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "This is detail page.")↲ } func main() { index := new(IndexHandler)↲ detail := new(DetailHandler)↲ http.Handle("/", index) http.Handle("/detail", detail) http.ListenAndServe(":8080", nil) }
  18. 18. http client (1/3) • func (c *Client) Get(url string) (resp *Response, err error) – 指定したURLに対してGETリクエストを送信してレスポンス を取得 – url : URL文字列
  19. 19. http 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 := http.Post(“http://example.com/upload", "image/jpeg", &buf)
  20. 20. http 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 := http.PostForm("http://example.com/form", url.Values{"key": {"Value"}, "id": {"123"}})
  21. 21. Package url • URLを管理するパッケージ – URLのパース – クエリーのエスケープ処理
  22. 22. type url type URL struct { Scheme string Opaque string // encoded opaque data User *Userinfo // username and password information 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]
  23. 23. url • func Parse(rawurl string) (url *URL, err error) – URL文字列をパースしてURLオブジェクトを取得 u, err := url.Parse("http://bing.com/search?q=dotnet") if err != nil { log.Fatal(err) } u.Scheme = "https” u.Host = "google.com” q := u.Query() q.Set("q", "golang") u.RawQuery = q.Encode() fmt.Println(u) > https://google.com/search?q=golang http://play.golang.org/p/8Id1F0vfvD
  24. 24. url • QueryEscape(s string) string – クエリーの文字列のエスケープに変換 • QueryUnescape(s string) (string, error) – エスケープされたクエリーを文字列に変換 escaped_url := url.QueryEscape(http://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 : http%3A%2F%2Fbing.com%2Fsearch%3Fq%3Dtest escaped_url : http://bing.com/search?q=test http://play.golang.org/p/-jZzlqHdXm
  25. 25. Package net • net • net/http – cgi – cookiejar – httptest – httputil – pprof • net/url 物理層 データリンク層 ネットワーク層 (IP) トランスポート層(TCP/UDP) アプリケーション層 (HTTP)

×