Go クライアント
検索
GET
URLエンコードしたSQLクエリを作成します。
q := url.QueryEscape("select count(*) from M$SYS_TABLES where name = 'TAGDATA'")HTTP GETメソッドを呼び出します。
| |
POST JSON
クライアントは、SQLクエリを含むJSONメッセージを送信できます。
SQLクエリを含むJSONボディを用意します。
| |
Content-Typeを指定して、HTTP POSTメソッドを呼び出します。
| |
ソースコード全体
| |
POST FormData
HTMLフォームデータでSQLクエリを送信することもできます。
data := url.Values{"q": {"select count(*) from M$SYS_TABLES where name = 'TAGDATA'"}}
rsp, err := client.Post(addr, "application/x-www-form-urlencoded", bytes.NewBufferString(data.Encode()))ソースコード全体
| |
書き込み
POST JSON
| |
POST CSV
| |
例
📌
以下のテーブルが存在することを前提とします。
CREATE TAG TABLE IF NOT EXISTS EXAMPLE (
NAME VARCHAR(20) PRIMARY KEY,
TIME DATETIME BASETIME,
VALUE DOUBLE SUMMARIZED
);GoでRESTful APIクライアントを作成する場合は、この方法を参考にしてください。
コードの説明
書き込みAPIのペイロードを表すデータ構造を定義します。
type WriteReq struct {
Table string `json:"table"`
Data WriteReqData `json:"data"`
}
type WriteReqData struct {
Columns []string `json:"columns"`
Rows [][]any `json:"rows"`
}HTTPでデータを書き込むAPIは、こちらで説明しています。JSONペイロードを受け取ります。
以下のようにペイロードを構成すると、1回のリクエストで複数のレコードを保存できます。
sinとcosは、適切なfloat64値で初期化済みとします。
content, _ := json.Marshal(&WriteReq{
Data: WriteReqData{
Columns: []string{"name", "time", "value"},
Rows: [][]any{
{"wave.sin", ts.UTC().UnixNano(), sin},
{"wave.cos", ts.UTC().UnixNano(), cos},
},
},
})これは以下のJSONにエンコードされ、書き込みAPIに渡されます。
{
"data": {
"columns":["name", "time", "value"],
"rows": [
[ "wave.sin", 1670380342000000000, 1.1 ],
[ "wave.cos", 1670380343000000000, 2.2 ]
]
}
}HTTP POSTリクエストでサーバーに送信します。
client := http.Client{}
rsp, err := client.Post("http://127.0.0.1:5654/db/write/EXAMPLE",
"application/json", bytes.NewBuffer(content))データの保存に成功すると、サーバーはHTTP 200 OKを返します。
ソースコード全体
package main
import (
"bytes"
"encoding/json"
"fmt"
"math"
"net/http"
"time"
)
type WriteReq struct {
Table string `json:"table"`
Data WriteReqData `json:"data"`
}
type WriteReqData struct {
Columns []string `json:"columns"`
Rows [][]any `json:"rows"`
}
func main() {
client := http.Client{}
for ts := range time.Tick(500 * time.Millisecond) {
delta := float64(ts.UnixMilli()%15000) / 15000
theta := 2 * math.Pi * delta
sin, cos := math.Sin(theta), math.Cos(theta)
content, _ := json.Marshal(&WriteReq{
Table: "EXAMPLE",
Data: WriteReqData{
Columns: []string{"name", "time", "value"},
Rows: [][]any{
{"wave.sin", ts.UTC().UnixNano(), sin},
{"wave.cos", ts.UTC().UnixNano(), cos},
},
},
})
rsp, err := client.Post(
"http://127.0.0.1:5654/db/write/example",
"application/json",
bytes.NewBuffer(content))
if err != nil {
panic(err)
}
if rsp.StatusCode != http.StatusOK {
panic(fmt.Errorf("response %d", rsp.StatusCode))
}
}
}最終更新日