Golangを勉強しています。
やること
- GolangでRakutenRapidApiを叩く
- APIKeyをconfig.iniに設定して、main.goファイルから呼び出す。
- さらに関数を別ファイルに切り分けmain.goファイルから呼び出す。
今回使うパッケージ
- "fmt"
- "io/ioutil"
- "net/http"
- "log"
- "os"
- "gopkg.in/ini.v1"
api
RakutenRapidApiに提供されているFearAndGreed Indexを取得するAPIを使用させていただきます。
クエリもなくレスポンスは1種類のみです。
config.ini config.go
ルートディレクトリにconfig.iniを作成し、api_keyを設置します。
//config.ini
[fgi]
api_key = XXXXXXXXXXXXXXXXXXXXXX
api_host = XXXXXXXXXXXXXXXXXXXXXX
//config.go
package config
import (
"log"
"os"
"gopkg.in/ini.v1"
)
type ConfigList struct {
FgiAPIKey string
FgiAPIHost string
}
// Config グローバル定義
var Config ConfigList
func init() {
cfg, err := ini.Load("config.ini")
if err != nil {
log.Printf("Failed to read file: %v", err)
os.Exit(1)
}
Config = ConfigList{
FgiAPIKey: cfg.Section("fgi").Key("api_key").String(),
FgiAPIHost: cfg.Section("fgi").Key("api_host").String(),
}
}
structを作成して、 ConfigListに先ほど設定したconfig.iniファイルのkey,hostを
.String()で文字列として格納します。
main.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"index-indicator-apis/config"
)
func main() {
url := "https://fear-and-greed-index.p.rapidapi.com/v1/fgi"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-rapidapi-host", config.Config.FgiAPIHost)
req.Header.Add("x-rapidapi-key", config.Config.FgiAPIKey)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(string(body))
}
"net/http"の http.NewRequestでGETして、Header.Addで先ほど作成したConfig(ConfigList)のKeyとHostを呼び出します。
ターミナルで実行
$ go run main.go
{"fgi":{"now":{"value":63,"valueText":"Greed"},"previousClose":{"value":56,"valueText":"Greed"},"oneWeekAgo":{"value":40,"valueText":"Fear"},"oneMonthAgo":{"value":56,"valueText":"Greed"},"oneYearAgo":{"value":83,"valueText":"Extreme Greed"}}}
レスポンスを得ることができました。
別ファイルに関数を切り分ける
main.goファイルはよりシンプルに実行するメソッドや関数のみを記述するのがGOの設計思想みたいです。
そこでfgi.goファイルをつくり関数を切り分けました。
// fgi.go
package fgi
import (
"fmt"
"io/ioutil"
"net/http"
"index-indicator-apis/config"
)
func DoRequest() {
url := "https://fear-and-greed-index.p.rapidapi.com/v1/fgi"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-rapidapi-host", config.Config.FgiAPIHost)
req.Header.Add("x-rapidapi-key", config.Config.FgiAPIKey)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(string(body))
}
//main.go
package main
import "index-indicator-apis/fgi"
func main() {
fgi.DoRequest()
}
以上です!
次はさらに関数をメソッド化して引数を渡して見たいと思います!