インターネットでは、クライアントとサーバというものがあり、クライアントがサーバに命令を送って、サーバがその結果を返すということをしている。
命令を送ることをリクエストと呼ぶ。今回はウェブサイトを表示するHTTPに焦点を絞って記載する。HTTPリクエストにはGETとPOSTというものがある。
今回は、HTTPのGETを使ってみる。
例えば、「植物のミカタ」というサイトのトップページにアクセスしたい場合は、一番簡単な方法はhttpが使えるClomeなどのアプリケーションのアドレスバーにhttps://saitodev.coと打ち込む方法である。これは、saitodev.co/index.htmlというサーバにあるデータを取ってくるように命令文を送っている意味がある。ちなみにhttps://saitodev.coの後には、index.htmlが省略してある。
※HTTPというのは、ハイパーテキストをネット間で通信する仕組みとのことである。
ハイパーテキストとは、複数の文書(テキスト)を相互に関連付け、結び付ける仕組みのこと
cf.ウィキペディアより
※httpsはhttpに暗号化通信の機能をアップグレードしたものである。
アドレスバーに手打ちしてサイトにアクセスしているのと同じ作業をGo言語のhttpパッケージのGET関数を使って実行してみる。
main.goファイルに下記のコードを記載する。
package main import ( "fmt" "log" "net/http" ) func main() { response, error := http.Get("https://saitodev.co/index.html") if error != nil { log.Fatal(error) } fmt.Println(response) }
response, error := http.Get("https://saitodev.co/index.html")はhttpパッケージのGET関数にhttps://saitodev.co/index.htmlの値を変数responseに挿入し、返り値はresponse, error という意味である。
返り値にerrorがある場合は、if error != nil { log.Fatal(error) }を続けて記載する決まりがある。
上記のコードを実行してみると、
&{200 OK 200 HTTP/2.0 2 0 map[Date:[Wed, 18 Apr 2018 04:21:55 GMT] Vary:[Accept-Encoding] Content-Type:[text/html; charset=UTF-8] Server:[Apache] Accept-Ranges:[bytes] X-Mod-Pagespeed:[1.13.35.2-0] Cache-Control:[max-age=0, no-cache]] 0xc042132120 -1 [] false true map[] 0xc0420f2000 0xc04209c420} [Finished in 1.903s]
の文字が表記される。これはステータスコードを呼び、このコード自体に意味を持つ。200は正しくデーターを取得できたという意味。
この段階ではresponseが返ってきただけである。では次にresponseの中のBodyの部分だけを表示してみる。Bodyは取得したいhtmlの内容が入っている。
fmt.Println(response)をfmt.Println(response.Body)
response.Body.Close()
に変更する。
そうすると
&{{0xc042124140}} [Finished in 1.592s] go-plus Go Output Reference Usage Implements
という文字が表記される。これは、メモリの番地のようなものを意味する。また、response.Bodyを使用した場合は、必ずClose関数を入れなければならない。これで、ストリームが閉じた状態になった。
最後に、
fmt.Println(response.Body)
response.Body.Close()
を消去して上記の文字を翻訳するコードを追加する。
body, error := ioutil.ReadAll(response.Body) if error != nil { log.Fatal(error) } fmt.Println(body) response.Body.Close()
ioutilは、入力出力(I/O)に関するパッケージで.ReadAllはresponseで返ってきたものを読み込んで使える形にする関数である。
これを実行すると、
のような数字が出てくる。これはデータが8bitの整数値に変換されたものである。
最後にfmt.Println(body)を消去し、bitで表された数字を文字に変更するコードを追加する。
html := string(body) fmt.Println(html) response.Body.Close()
実行すると、下記のように表示したかった「植物のミカタ」のサイトのhtmlが返ってくる。
上記の一連のコードを下記に記載する。
package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { response, error := http.Get("https://saitodev.co/index.html") if error != nil { log.Fatal(error) } body, error := ioutil.ReadAll(response.Body) if error != nil { log.Fatal(error) } html := string(body) fmt.Println(html) response.Body.Close() }