您的第一个Golang Rest API客户端
#教程 #go #dataapi #forexdata

在本教程中,我们将帮助您设置环境并编写一个程序,以从REST API请求数据,解析数据并将其输出到控制台。如果您已经安装了Golang,则可以跳过本教程的第一部分,然后跳到编码部分。

本教程涵盖了获取RESTFUL API的实时外汇数据,但可以适用于提供JSON数据的任何API。

对于WebSocket实施,请阅读您的第一个Golang Websocket:FX Data

首先,下载并安装Golang

首先,从https://golang.org/doc/install下载并安装Golang,一旦运行Golang,您就可以打开命令窗口并键入以下命令,您应该获得版本输出。

go -version
go version go1.17.1 windows/amd64

此程序所需的最后一件事是您的Tradermade API密钥,如果您没有一个可以免费注册,则可以从仪表板上复制它。

好的,让我们编写一些代码。

首先,我们需要为此添加一些软件包名称,然后我将要使用``主要'',然后我们将导入一些我们要使用的软件包,编码/json,这将有助于解析JSON, FMT将帮助打印语句,io/ioutil将允许程序基本读取命令,日志将其记录到控制台,以便我们看到程序在做什么,并且NET/HTTP将允许我们允许我们打电话给休息服务。

package main
  import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
  )

我们添加主函数。它将是程序的入口点,在此主要功能中,我们将首先定义货币参数,API_KEY参数和URL。下面的api_key有一个字符串âYour_api_key - 您应该在其中插入API_KEY。

func main(){
    currencies := "EURUSD,GBPUSD"
    api_key := "your_api_key"
    url := "https://marketdata.tradermade.com/api/v1/live?currency=" + currencies + "&api_key=" + api_key
  }

现在,我们将使用上一步中定义的URL添加http.get请求。我们还将添加一些捕获错误的代码,这些代码将检查get呼叫时设置的geterr变量,如果是nil,我们将继续使用错误。

resp, getErr := http.Get(url)
  if getErr != nil {
        log.Fatal(getErr)
  }

接下来,我们检查了我们是否从get呼叫中收到了一些数据,我们将使用ioutil.readall函数检索请求主体。再次,我们检查res.body。
中的错误

body, readErr := ioutil.ReadAll(res.Body)
  if readErr != nil {
      log.Fatal(readErr)
    }

现在我们需要解析JSON机构,但是在我们做到这一点之前,我们需要了解它的组成。为此,只需打印我们在主要功能内收到的身体的弦。

func main(){
    currencies := "EURUSD,GBPUSD"
    api_key := "your_api_key"
    url := "https://marketdata.tradermade.com/api/v1/live?currency=" + currencies + "&api_key=" + api_key
    resp, getErr := http.Get(url)
    if getErr != nil {
      log.Fatal(getErr)
    }
    body, readErr := ioutil.ReadAll(res.Body)
    if readErr != nil {
      log.Fatal(readErr)
    }
    fmt.Println(string(body)) 
   }

并在命令终端中运行命令go运行的文件(我们已将文件保存为main.go)。

{
   "endpoint": "live",
   "quotes": [
    {
     "ask": 1.15537,
     "base_currency": "EUR",
     "bid": 1.15536,
     "mid": 1.15536,
     "quote_currency": "USD"
    },
    {
     "ask": 1.3621,
     "base_currency": "GBP",
     "bid": 1.36208,
     "mid": 1.36209,
     "quote_currency": "USD"
    }
   ],
   "requested_time": "Tue, 12 Oct 2021 11:34:26 GMT",
   "timestamp": 1634038467
}

您现在可以看到我们收到的JSON主体上方。但是,这只是一个字符串,如果您正在使用对象,则不是很有用。由于Golang是一种强烈键入的语言,因此我们需要做一些工作,然后才能解析收到的数据。我们首先必须定义要将响应主体写入的数据结构。如您所见,以下数据结构与我们上面打印的数据匹配

type data struct {
      Endpoint       string                   `json:'endpoint'`
      Quotes         []map[string]interface{} `json:'quotes'`
      Requested_time string                   `json:'requested_time'`
      Timestamp      int32                    `json:'timestamp'`
  }

尽管大多数是直截了当的,但了解如何定义数据结构中的引号将很有帮助。

我们将引号定义为[] map [string]接口{},用简单的语言意味着将键的映射作为字符串类型和值作为未知类型。地图只是一个带有键和值的JSON对象(类似于Python中的字典),但是在Golang中,我们必须定义它。该界面是一个略有不同的概念,但通常用于分析JSON时,当值类型未知时。

现在,我们已经定义了数据结构,这是我们只需要将其放入内存中的对象中的重要位即可。我们将通过分配数据结构一个称为data_obj的变量,然后我们收到的数据构造的范围来做到这一点。

data_obj := data{}
  jsonErr := json.Unmarshal(body, &data_obj)
  if jsonErr != nil {
     log.Fatal(jsonErr)
  }

现在,我们将打印解析的值,并可以根据需要使用它们。我们将简单地打印所有值并在我们之前定义的引号上进行迭代。

fmt.Println("endpoint", data_obj.Endpoint, "requested time", data_obj.Requested_time, "timestamp", data_obj.Timestamp)
  for key, value := range data_obj.Quotes {
     fmt.Println(key)
     fmt.Println("symbol", value["base_currency"]+value["quote_currency"], "bid", value["bid"], "ask", value["ask"],
"mid", value["mid"])
  }

我们现在可以看到我们已经打印了数据结构中定义的所有值。现在使用这些键和值应该很简单。

endpoint live requested time Tue, 12 Oct 2021 17:40:05 GMT timestamp 1634060405
0
symbol EUR USD bid 1.15256 ask 1.15256 mid 1.15256
1
  symbol GBP USD bid 1.35834 ask 1.35836 mid 1.35835

以下是可以复制的golang代码,以开始获取实时外汇和CFD数据。请记住要从仪表板上添加您的API键。希望本文有助于解析Golang的JSON REST API。如果您喜欢我们的作品或对以后的文章有建议,请发表评论和拍手,我们想收到您的来信。

package main
import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)
type data struct {
      Endpoint       string                   `json:'endpoint'`
      Quotes         []map[string]interface{} `json:'quotes'`
      Requested_time string               `json:'requested_time'`
      Timestamp      int32                    `json:'timestamp'`
  }
func main(){
      currencies := "EURUSD,GBPUSD"
      api_key := "your_api_key"
      url := "https://marketdata.tradermade.com/api/v1/live?currency=" + currencies + "&api_key=" + api_key
      resp, getErr := http.Get(url)
      if getErr != nil {
        log.Fatal(getErr)
      }
      body, readErr := ioutil.ReadAll(res.Body)
      if readErr != nil {
        log.Fatal(readErr)
      }
      fmt.Println(string(body)) 
      data_obj := data{}
      jsonErr := json.Unmarshal(body, &data_obj)
      if jsonErr != nil {
         log.Fatal(jsonErr)
      }
      fmt.Println("endpoint", data_obj.Endpoint, "requested time", data_obj.Requested_time, "timestamp", data_obj.Timestamp)
      for key, value := range data_obj.Quotes {
           fmt.Println(key)
           fmt.Println("symbol", value["base_currency"]+value["quote_currency"], "bid", value["bid"], "ask", value["ask"],
      "mid", value["mid"])
      }
 }