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 페이로드를 기대합니다.
아래 코드처럼 페이로드를 구성하면 한 번의 요청으로 여러 레코드를 저장할 수 있습니다.
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))
}
}
}
최근 업데이트