LoginSignup
1
0

More than 3 years have passed since last update.

Golang api get

Posted at

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

以上です!
次はさらに関数をメソッド化して引数を渡して見たいと思います!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0