Help us understand the problem. What is going on with this article?

Golang api get

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away