kid_job_boy_programmer

インターネットでは、クライアントとサーバというものがあり、クライアントがサーバに命令を送って、サーバがその結果を返すということをしている。

命令を送ることをリクエストと呼ぶ。今回はウェブサイトを表示するHTTPに焦点を絞って記載する。HTTPリクエストにはGETとPOSTというものがある。

今回は、HTTPのGETを使ってみる。

例えば、「植物のミカタ」というサイトのトップページにアクセスしたい場合は、一番簡単な方法はhttpが使えるClomeなどのアプリケーションのアドレスバーにhttps://saitodev.coと打ち込む方法である。これは、saitodev.co/index.htmlというサーバにあるデータを取ってくるように命令文を送っている意味がある。ちなみにhttps://saitodev.coの後には、index.htmlが省略してある。

※HTTPというのは、ハイパーテキストをネット間で通信する仕組みとのことである。

ハイパーテキストとは、複数の文書テキスト)を相互に関連付け、結び付ける仕組みのこと

 cf.ウィキペディアより


shokubutu

※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で返ってきたものを読み込んで使える形にする関数である。

これを実行すると、

suuji

のような数字が出てくる。これはデータが8bitの整数値に変換されたものである。

最後にfmt.Println(body)を消去し、bitで表された数字を文字に変更するコードを追加する。

html := string(body)
fmt.Println(html)
response.Body.Close()

実行すると、下記のように表示したかった「植物のミカタ」のサイトのhtmlが返ってくる。

tuyoshi

上記の一連のコードを下記に記載する。

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