在本教程中,我们将帮助你设置环境并编写一个程序来请求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
评论(0)