net

net

https://golang.org/pkg/net/

ネットワーク通信の汎用的なインタフェースを提供する。

Examples:

// HTTP client
conn, err := net.Dial("tcp", "golang.org:80")
if err != nil {
	// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')

// TCP server
ln, err := net.Listen("tcp", ":8080")
if err != nil {
	// handle error
}
for {
	conn, err := ln.Accept()
	if err != nil {
		// handle error
	}
	go handleConnection(conn)
}

type Dialer

https://golang.org/pkg/net/#Dialer

宛先に通信するためのオプションを保持する。
各オプションがゼロ値であれば、オプション無しを意味し、単にDial関数を呼ぶに等しい。

type Dialer struct {
  // コネクションタイムアウト
  // デフォルトはタイムアウトしない
  Timeout time.Duration
  :
}

net/http

https://golang.org/pkg/net/http/

HTTPクライアント・サーバ機能を提供するライブラリ。

クライアントは処理が終わったらレスポンスBODYを閉じないと駄目。

Example:

resp, err := http.Get("http://example.com/")
if err != nil {
	// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// :

参考:

Examples

リクエスト結果をファイルに書き込む:

resp, err := http.Get("...")
check(err)
defer resp.Body.Close()
out, err := os.Create("filename.ext")
if err != nil {
    // panic?
}
defer out.Close()
io.Copy(out, resp.Body)

参考:

Variables

var DefaultClient = &Client{}

DefaultTransport

https://golang.org/pkg/net/http/#RoundTripper

var DefaultTransport RoundTripper = &Transport{
    Proxy: ProxyFromEnvironment,
    DialContext: (&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
        DualStack: true,
    }).DialContext,
    ForceAttemptHTTP2:     true,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}

type Client

https://golang.org/pkg/net/http/#Client

HTTPクライアント。

type Client struct {
    // デフォルトではDefaultTransportが使われる
    Transport RoundTripper
    // HTTPリクエストのタイムリミット。
    // デフォルト(ゼロ値)ではタイムアウトしない。
    Timeout time.Duration
    :
}

type Response

https://golang.org/pkg/net/http/#Response

type Response struct {
    Status     string // e.g. "200 OK"
    StatusCode int    // e.g. 200
    Proto      string // e.g. "HTTP/1.0"
    ProtoMajor int    // e.g. 1
    ProtoMinor int    // e.g. 0
    Header Header
    Body io.ReadCloser
    ContentLength int64
    TransferEncoding []string
    Close bool
    Uncompressed bool // Go 1.7
    Trailer Header
    Request *Request
    TLS *tls.ConnectionState // Go 1.3
}

net/url

https://golang.org/pkg/net/url/

URLパーサとクエリのエスケープを実装する。

URLパスの結合

雑に次のようにやると失敗する:

url := "https://example.com/"
loc := "path/to/index.html"
fullURL := path.Join(url, loc) //=> "https:/example.com/path/to/index.html"

スキーム部分もパスの一部と解釈されておかしなことになる。

面倒だが、汎用的に対処するには、次のようにする。

// エラー処理省略
urlObj, _ := url.Parse(url)
urlObj.Path = path.Join(urlObj.Path, loc)
fullURL := urlObj.String() //=> "https://example.com/path/to/index.html"

func Parse

https://golang.org/pkg/net/url/#Parse

func Parse(rawurl string) (*URL, error)

URL文字列をパースしてURL構造体の値を作る。

type URL

https://golang.org/pkg/net/url/#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    // path (relative paths may omit leading slash)
    RawPath    string    // encoded path hint (see EscapedPath method); added in Go 1.5
    ForceQuery bool      // append a query ('?') even if RawQuery is empty; added in Go 1.7
    RawQuery   string    // encoded query values, without '?'
    Fragment   string    // fragment for references, without '#'
}

func String

https://golang.org/pkg/net/url/#URL.String

func (u *URL) String() string

URL文字列を作って返す。