在本教程中,我们将帮助您设置环境并编写一个程序,以从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"])
}
}