首页
Preview

你的第一个 Golang REST API 客户端

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

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

关于WebSocket实现,可以阅读你的第一个Golang WebSocket:FX数据

首先,下载并安装Golang

首先,从https://golang.org/doc/install下载并安装GoLang,一旦你运行了Golang,你可以打开一个命令窗口并输入以下命令,你应该会得到版本输出。

go -versiongo version go1.17.1 windows/amd64

获取你的API密钥

此程序的最后一件事情是你的TraderMade API密钥,如果你没有密钥,可以免费注册,然后你可以从仪表板中复制它。

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

首先,我们需要添加一些包名称,为此我只是使用“main”,然后我们将导入一些我们要使用的包,编码/JSON将帮助解析JSON,fmt将帮助打印语句,io/ioutil将允许程序基本读写命令,log用于将消息记录到控制台,以便我们可以看到程序正在做什么,net/http将允许我们向REST服务发出get调用。

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

然后,我们添加了main函数。它将是程序的入口点,在这个主函数中,我们将首先定义货币参数、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  }

现在我们要添加一个http.Get请求,使用我们在前一步中定义的url。我们还将添加一些错误捕获代码,检查我们进行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 run“main.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'`
  }

虽然大部分都是直截了当的,但了解如何定义数据结构还是很有帮助的。

我们将Quotes定义为[]map[string]interface{},简单来说,这意味着一个带有字符串类型键和未知类型值的映射数组。映射只是具有键和值的JSON对象(类似于Python中的字典),但在Golang中我们必须定义它。接口是一个略微不同的概念,但通常在解析JSON时使用,当值类型未知时。

既然我们已经定义了我们的数据结构,这就是重要的部分,我们只需要将其解码为内存中的对象。我们将通过将数据结构分配一个名为data_obj的变量,然后将我们收到的数据的解码主体分配给它来完成这个操作。

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

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

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

下面是获取实时外汇和CFD数据的Golang的全部代码,可以复制粘贴。请记住从仪表板中添加你的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"])
      }
 }

译自:https://medium.com/nerd-for-tech/your-first-golang-rest-api-client-287c8dc0961

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
菜鸟一只
你就是个黄焖鸡,又黄又闷又垃圾。

评论(0)

添加评论