Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Gunosy Go lang study #6 net http url

14,007 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)

×