TDengine Restful 接口API

簡介

為支持各種不同類型平臺的開發,TDengine 提供符合 RESTful 設計標準的 API,即 REST API。為最大程度降低學習成本,不同于其他數據庫 REST API 的設計方法,TDengine 直接通過 HTTP POST 請求 BODY 中包含的 SQL 語句來操作數據庫,僅需要一個 URL。REST API 的使用參見 視頻教程。

:::note
與原生連接器的一個區別是,RESTful 接口是無狀態的,因此 USE db_name 指令沒有效果,所有對表名、超級表名的引用都需要指定數據庫名前綴。支持在 RESTful URL 中指定 db_name,這時如果 SQL 語句中沒有指定數據庫名前綴的話,會使用 URL 中指定的這個 db_name。
:::

安裝

RESTful 接口不依賴于任何 TDengine 的庫,因此客戶端不需要安裝任何 TDengine 的庫,只要客戶端的開發語言支持 HTTP 協議即可。TDengine 的 RESTful API 由 taosAdapter 提供,在使用 RESTful API 之前需要確保 taosAdapter 正常運行。

驗證

在已經安裝 TDengine 服務器端的情況下,可以按照如下方式進行驗證。

下面以 Ubuntu 環境中使用 curl 工具(請確認已經安裝)來驗證 RESTful 接口是否工作正常,驗證前請確認 taosAdapter 服務已開啟,在 Linux 系統上此服務默認由 systemd 管理,使用命令 systemctl start taosadapter 啟動。

下面示例是列出所有的數據庫,請把 h1.taosdata.com 和 6041(缺省值)替換為實際運行的 TDengine 服務 FQDN 和端口號:

curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" \-d "select name, ntables, status from information_schema.ins_databases;" \h1.taosdata.com:6041/rest/sql

返回值結果如下表示驗證通過:

{"code": 0,"column_meta": [["name","VARCHAR",64],["ntables","BIGINT",8],["status","VARCHAR",10]],"data": [["information_schema",16,"ready"],["performance_schema",9,"ready"]],"rows": 2
}

HTTP 請求格式

http://<fqdn>:<port>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]

參數說明:

  • fqdn:集群中的任一臺主機 FQDN 或 IP 地址。
  • port:配置文件中 httpPort 配置項,缺省為 6041。
  • db_name:可選參數,指定本次所執行的 SQL 語句的默認數據庫庫名。
  • tz:可選參數,指定返回時間的時區,遵照 IANA Time Zone 規則,如 America/New_York
  • req_id:可選參數,指定請求 id,可以用于 tracing。
  • row_with_meta:可選參數,指定是否每行數據都攜帶列名,缺省為 false。(3.3.2.0 版本開始支持)

例如:http://h1.taos.com:6041/rest/sql/test 是指向地址為 h1.taos.com:6041 的 URL,并將默認使用的數據庫庫名設置為 test

HTTP 請求的 Header 里需帶有身份認證信息,TDengine 支持 Basic 認證與自定義認證兩種機制,后續版本將提供標準安全的數字簽名機制來做身份驗證。

  • 自定義身份認證信息如下所示:

    Authorization: Taosd <TOKEN>
    
  • Basic 身份認證信息如下所示:

    Authorization: Basic <TOKEN>
    

HTTP 請求的 BODY 里就是一個完整的 SQL 語句,SQL 語句中的數據表應提供數據庫前綴,例如 db_name.tb_name。如果表名不帶數據庫前綴,又沒有在 URL 中指定數據庫名的話,系統會返回錯誤。因為 HTTP 模塊只是一個簡單的轉發,沒有當前 DB 的概念。

使用 curl 通過自定義身份認證方式來發起一個 HTTP Request,語法如下:

curl -L -H "Authorization: Basic <TOKEN>" -d "<SQL>" <ip>:<PORT>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]

或者,

curl -L -u username:password -d "<SQL>" <ip>:<PORT>/rest/sql/[db_name][?tz=timezone[&req_id=req_id][&row_with_meta=true]]

其中,TOKEN{username}:{password} 經過 Base64 編碼之后的字符串,例如 root:taosdata 編碼后為 cm9vdDp0YW9zZGF0YQ==

HTTP 返回格式

HTTP 響應碼

默認情況下,taosAdapter 對大多數 C 接口調用出錯時也會返回 200 響應碼,但是 HTTP body 中包含錯誤信息。從 TDengine 3.0.3.0 開始 taosAdapter 提供配置參數 httpCodeServerError 用來設置當 C 接口返回錯誤時是否返回非 200 的 HTTP 響應碼。無論是否設置此參數,響應 body 里都有詳細的錯誤碼和錯誤信息,具體請參考 錯誤 。

當 httpCodeServerError 為 false 時:

分類說明HTTP 響應碼
C 接口調用成功200
C 接口調用出錯,且不是鑒權錯誤200
HTTP 請求 URL 參數錯誤400
C 接口調用鑒權錯誤401
接口不存在404
系統資源不足503

當 httpCodeServerError 為 true 時:

分類說明HTTP 響應碼
C 接口調用成功200
HTTP 請求 URL 參數錯誤和 C 接口調用參數解析錯誤400
C 接口調用鑒權錯誤401
接口不存在404
C 接口調用網絡不可用錯誤502
系統資源不足503
其他 C 接口調用錯誤500

C 接口參數解析相關錯誤碼:

  • TSDB_CODE_TSC_SQL_SYNTAX_ERROR (0x0216)
  • TSDB_CODE_TSC_LINE_SYNTAX_ERROR (0x021B)
  • TSDB_CODE_PAR_SYNTAX_ERROR (0x2600)
  • TSDB_CODE_TDB_TIMESTAMP_OUT_OF_RANGE (0x060B)
  • TSDB_CODE_TSC_VALUE_OUT_OF_RANGE (0x0224)
  • TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE (0x263B)

C 接口鑒權相關錯誤碼:

  • TSDB_CODE_MND_USER_ALREADY_EXIST (0x0350)
  • TSDB_CODE_MND_USER_NOT_EXIST (0x0351)
  • TSDB_CODE_MND_INVALID_USER_FORMAT (0x0352)
  • TSDB_CODE_MND_INVALID_PASS_FORMAT (0x0353)
  • TSDB_CODE_MND_NO_USER_FROM_CONN (0x0354)
  • TSDB_CODE_MND_TOO_MANY_USERS (0x0355)
  • TSDB_CODE_MND_INVALID_ALTER_OPER (0x0356)
  • TSDB_CODE_MND_AUTH_FAILURE (0x0357)

C 接口網絡不可用相關錯誤碼:

  • TSDB_CODE_RPC_NETWORK_UNAVAIL (0x000B)

錯誤碼和錯誤描述請參考 錯誤碼

HTTP body 結構

正確執行插入

樣例:

{"code": 0,"column_meta": [["affected_rows", "INT", 4]],"data": [[0]],"rows": 1
}

說明:

  • code:(int)0 代表成功。
  • column_meta:([1][3]any)只返回 [["affected_rows", "INT", 4]]
  • rows:(int)只返回 1
  • data:([][]any)返回受影響行數。
正確執行查詢

樣例:

{"code": 0,"column_meta": [["ts", "TIMESTAMP", 8],["count", "BIGINT", 8],["endpoint", "VARCHAR", 45],["status_code", "INT", 4],["client_ip", "VARCHAR", 40],["request_method", "VARCHAR", 15],["request_uri", "VARCHAR", 128]],"data": [["2022-06-29T05:50:55.401Z",2,"LAPTOP-NNKFTLTG:6041",200,"172.23.208.1","POST","/rest/sql"],["2022-06-29T05:52:16.603Z",1,"LAPTOP-NNKFTLTG:6041",200,"172.23.208.1","POST","/rest/sql"],["2022-06-29T06:28:14.118Z",1,"LAPTOP-NNKFTLTG:6041",200,"172.23.208.1","POST","/rest/sql"],["2022-06-29T05:52:16.603Z",2,"LAPTOP-NNKFTLTG:6041",401,"172.23.208.1","POST","/rest/sql"]],"rows": 4
}

說明:

  • code:(int)0 代表成功。
  • column_meta:([][3]any)列信息,每個列會用三個值來說明,分別為:列名(string)、列類型(string)、類型長度(int)。
  • rows:(int)數據返回行數。
  • data:([][]any)具體數據內容(時間格式僅支持 RFC3339,結果集為 0 時區,指定 tz 時返回對應時區)。

列類型使用如下字符串:

  • “NULL”
  • “BOOL”
  • “TINYINT”
  • “SMALLINT”
  • “INT”
  • “BIGINT”
  • “FLOAT”
  • “DOUBLE”
  • “VARCHAR”
  • “TIMESTAMP”
  • “NCHAR”
  • “TINYINT UNSIGNED”
  • “SMALLINT UNSIGNED”
  • “INT UNSIGNED”
  • “BIGINT UNSIGNED”
  • “JSON”
  • “VARBINARY”
  • “GEOMETRY”

VARBINARYGEOMETRY 類型返回數據為 Hex 字符串,樣例:

準備數據

create database demo
use demo
create table t(ts timestamp,c1 varbinary(20),c2 geometry(100))
insert into t values(now,'\x7f8290','point(100 100)')

執行查詢

curl --location 'http://<fqdn>:<port>/rest/sql' \
--header 'Content-Type: text/plain' \
--header 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' \
--data 'select * from demo.t'

返回結果

{"code": 0,"column_meta": [["ts","TIMESTAMP",8],["c1","VARBINARY",20],["c2","GEOMETRY",100]],"data": [["2023-11-01T06:28:15.210Z","7f8290","010100000000000000000059400000000000005940"]],"rows": 1
}
  • 010100000000000000000059400000000000005940point(100 100) 的 Well-Known Binary (WKB) 格式
錯誤

樣例:

{"code": 9728,"desc": "syntax error near \"1\""
}

說明:

  • code:(int)錯誤碼。
  • desc:(string)錯誤描述。

錯誤碼和錯誤描述請參考 錯誤碼

返回 key-value 形式數據

當指定 url 參數 row_with_meta=true 時,返回的 data 中的數據會從數組的形式變成對象的形式,對象的 key 為列名,value 為數據,如下所示:

插入數據返回示例

{"code": 0,"column_meta": [["affected_rows","INT",4]],"data": [{"affected_rows": 1}],"rows": 1
}

查詢數據返回示例

{"code": 0,"column_meta": [["ts","TIMESTAMP",8],["current","FLOAT",4],["voltage","INT",4],["phase","FLOAT",4],["groupid","INT",4],["location","VARCHAR",24]],"data": [{"ts": "2017-07-14T02:40:00.000Z","current": -2.498076,"voltage": 0,"phase": -0.846025,"groupid": 8,"location": "California.Sunnyvale"}],"rows": 1
}

自定義授權碼

HTTP 請求中需要帶有授權碼 <TOKEN>,用于身份識別。授權碼通常由管理員提供,可簡單的通過發送 HTTP GET 請求來獲取授權碼,操作如下:

curl http://<fqnd>:<port>/rest/login/<username>/<password>

其中,fqdn 是 TDengine 數據庫的 FQDN 或 IP 地址,port 是 TDengine 服務的端口號,username 為數據庫用戶名,password 為數據庫密碼,返回值為 JSON 格式,各字段含義如下:

  • code:返回值代碼。
  • desc:授權碼。

獲取授權碼示例:

curl http://192.168.0.1:6041/rest/login/root/taosdata

返回值:

{"code": 0,"desc": "/KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04"
}

使用示例

  • 在 demo 庫里查詢表 d1001 的所有記錄:

    curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" -d "select * from demo.d1001" 192.168.0.1:6041/rest/sql
    curl -L -H "Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04" -d "select * from demo.d1001" 192.168.0.1:6041/rest/sql
    

    返回值:

    {"code": 0,"column_meta": [["ts","TIMESTAMP",8],["current","FLOAT",4],["voltage","INT",4],["phase","FLOAT",4]],"data": [["2022-07-30T06:44:40.32Z",10.3,219,0.31],["2022-07-30T06:44:41.32Z",12.6,218,0.33]],"rows": 2
    }
    
  • 創建庫 demo:

    curl -L -H "Authorization: Basic cm9vdDp0YW9zZGF0YQ==" -d "create database demo" 192.168.0.1:6041/rest/sql
    curl -L -H "Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04" -d "create database demo" 192.168.0.1:6041/rest/sql
    

    返回值:

    {"code": 0,"column_meta": [["affected_rows","INT",4]],"data": [[0]],"rows": 1
    }
    

TDengine 2.x 和 3.0 之間 REST API 的差異

URI

URITDengine 2.xTDengine 3.0
/rest/sql支持支持(響應代碼和消息體不同)
/rest/sqlt支持不再支持
/rest/sqlutc支持不再支持

HTTP code

HTTP codeTDengine 2.xTDengine 3.0備注
200支持支持正確返回和 taosc 接口錯誤返回
400不支持支持參數錯誤返回
401不支持支持鑒權失敗
404支持支持接口不存在
500不支持支持內部錯誤
503支持支持系統資源不足

響應代碼和消息體

TDengine 2.x 響應代碼和消息體
{"status": "succ","head": ["name","created_time","ntables","vgroups","replica","quorum","days","keep1,keep2,keep(D)","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","precision","status"],"data": [["log","2020-09-02 17:23:00.039",4,1,1,1,10,"30,30,30",1,3,100,4096,1,3000,2,"us","ready"]],"rows": 1
}
  "data": [["information_schema",16,"ready"],["performance_schema",9,"ready"]],
TDengine 3.0 響應代碼和消息體
{"code": 0,"column_meta": [["name","VARCHAR",64],["ntables","BIGINT",8],["status","VARCHAR",10]],"data": [["information_schema",16,"ready"],["performance_schema",9,"ready"]],"rows": 2
}

訪問官網

更多內容歡迎訪問 TDengine 官網

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901909.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Contiki】Contiki process概述

00. 目錄 文章目錄 00. 目錄01. 進程類型02. 進程結構03. 事件04. 進程調度函數05. 程序實例06. process實現07. 附錄 01. 進程類型 進程類型主要有**協同式&#xff08;cooperative&#xff09;和搶占式&#xff08;preemptive&#xff09;**兩種。 協同式進程&#xff0c;要…

哪種電腦更穩定?Mac?Windows?還是云電腦? 實測解密

隨著科技的發展進步&#xff0c;電腦已成為當下各類群體的必備產品之一&#xff0c;它的妙用有很多&#xff0c;無論是學生黨、打工人還是已經退休的人群或都離不開它的存在。然而&#xff0c;電腦雖好卻也差異很大、不同品牌、不同系統、不同配置、不同價位的統統都會有區別。…

華為openEuler操作系統全解析:起源、特性與生態對比

華為openEuler操作系統全解析&#xff1a;起源、特性與生態對比 一、起源與發展歷程 openEuler&#xff08;歐拉操作系統&#xff09;是華為于2019年開源的Linux發行版&#xff0c;其前身為華為內部研發的服務器操作系統EulerOS。EulerOS自2010年起逐步發展&#xff0c;支持華…

第 7 期:DDPM 采樣提速方案:從 DDPM 到 DDIM

本期關鍵詞:采樣加速、DDIM 推導、可控性提升、偽逆過程、代碼實戰 前情回顧:DDPM 的采樣瓶頸 在前幾期中,我們構建了一個完整的 DDPM 生成流程。但是你可能已經發現: 生成一張圖像太慢了!!! 原因是: DDPM 要在 T 個時間步中一步步地去噪,從 x_T → x_0。而通常 T 至…

chrome中的copy xpath 與copy full xpath的區別

學過測試或者爬蟲的&#xff0c;都感覺獲取網頁元素&#xff0c;使用xpath最方便 但其中有一些細節可能會使你摸不清頭腦 比如有時候copy xpath會定位不準確&#xff0c;而使用copy full xpath就可以定位 1、copy xpath&#xff08;相對路徑定位&#xff09; 優點&#xff…

學習海康VisionMaster之中線查找

一&#xff1a;進一步學習了 今天學習下VisionMaster中的中線查找&#xff0c;這個就是字面意思&#xff0c;輸入兩條直線&#xff0c;輸出兩條直線的中線 二&#xff1a;開始學習 1&#xff1a;什么是中線查找&#xff1f;今天這個比較簡單&#xff0c;其實這個模塊算是一個幾…

深入淺出 Multi-Head Attention:原理 + 例子 + PyTorch 實現

本文帶你一步步理解 Transformer 中最核心的模塊&#xff1a;多頭注意力機制&#xff08;Multi-Head Attention&#xff09;。從原理到實現&#xff0c;配圖 舉例 PyTorch 代碼&#xff0c;一次性說清楚&#xff01; 什么是 Multi-Head Attention&#xff1f; 簡單說&#x…

常用 Git 命令詳解

Git 是一個強大的版本控制工具&#xff0c;廣泛用于軟件開發和團隊協作中。掌握 Git 命令可以幫助開發者更高效地管理代碼版本和項目進度。本文將介紹一些常用的 Git 命令&#xff0c;并提供示例以幫助你更好地理解和應用這些命令。 目錄 常用命令 git clonegit stashgit pul…

NO.96十六屆藍橋杯備戰|圖論基礎-多源最短路|Floyd|Clear And Present Danger|災后重建|無向圖的最小環問題(C++)

多源最短路&#xff1a;即圖中每對頂點間的最短路徑 floyd算法本質是動態規劃&#xff0c;?來求任意兩個結點之間的最短路&#xff0c;也稱插點法。通過不斷在兩點之間加?新的點&#xff0c;來更新最短路。 適?于任何圖&#xff0c;不管有向?向&#xff0c;邊權正負&…

電流模式控制學習

電流模式控制 電流模式控制&#xff08;CMC&#xff09;是開關電源中廣泛使用的一種控制策略&#xff0c;其核心思想是通過內環電流反饋和外環電壓反饋共同調節占空比。相比電壓模式控制&#xff0c;CMC具有更快的動態響應和更好的穩定性&#xff0c;但也存在一些固有缺點。 …

MATLAB 控制系統設計與仿真 - 36

魯棒工具箱定義了個新的對象類ureal,可以定義在某個區間內可變的變量。 函數的調用格式為&#xff1a; p ureal(name,nominalvalue) % name為變量名,nominalValue為標稱值&#xff0c;默認變化值為/-1 p ureal(name,nominalvalue,PlusMinus,plusminus) p ureal(name,nomin…

LeetCode -- Flora -- edit 2025-04-17

1.最長連續序列 128. 最長連續序列 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [1…

Sql刷題日志(day3)

一、筆試 1、min(date_time)&#xff1a;求最早日期 2、mysql中distinct不能與order by 連用&#xff0c;可以用group by去重 二、面試 1、SQL中如何利用replace函數統計給定重復字段在字符串中的出現次數 (length(all_string)-length(all_string,目標字符串,))/length(ta…

解決 Spring Boot 多數據源環境下事務管理器沖突問題(非Neo4j請求標記了 @Transactional 嘗試啟動Neo4j的事務管理器)

0. 寫在前面 到底遇到了什么問題&#xff1f; 簡潔版&#xff1a; 在 Oracle 與 Neo4j 共存的多數據源項目中&#xff0c;一個僅涉及 Oracle 操作的請求&#xff0c;卻因為 Neo4j 連接失敗而報錯。根本原因是 Spring 的默認事務管理器錯誤地指向了 Neo4j&#xff0c;導致不相…

理解和實現RESTful API的最佳實踐

理解和實現RESTful API的最佳實踐 在當今數字化時代&#xff0c;APIs已成為軟件開發的核心組件&#xff0c;而RESTful API以其簡潔、靈活和可擴展性成為最流行的API設計風格。本文將深入探討RESTful API的概念、特點和實施指南&#xff0c;幫助開發者構建高效、可靠的Web服務。…

大語言模型微調技術與實踐:從原理到應用

大語言模型微調技術與實踐&#xff1a;從原理到應用 摘要&#xff1a;隨著大語言模型&#xff08;LLM&#xff09;技術的迅猛發展&#xff0c;預訓練語言模型在各種自然語言處理任務中展現出強大的能力。然而&#xff0c;將這些通用的預訓練模型直接應用于特定領域或任務時&am…

遨游科普:三防平板除了三防特性?還能實現什么功能?

在工業4.0浪潮席卷全球的今天&#xff0c;電子設備的功能邊界正經歷著革命性突破。三防平板電腦作為"危、急、特"場景的智能終端代表&#xff0c;其價值早已超越防水、防塵、防摔的基礎防護屬性。遨游通訊通過系統級技術創新&#xff0c;將三防平板打造為集通信中樞、…

前端實戰:基于 Vue 與 QRCode 庫實現動態二維碼合成與下載功能

在現代 Web 應用開發中&#xff0c;二維碼的應用越來越廣泛&#xff0c;從電子票務到信息傳遞&#xff0c;它都扮演著重要角色。本文將分享如何在 Vue 項目中&#xff0c;結合QRCode庫實現動態二維碼的生成、與背景圖合成以及圖片下載功能&#xff0c;打造一個完整且實用的二維…

HAL詳解

一、直通式HAL 這里使用一個案例來介紹直通式HAL&#xff0c;選擇MTK的NFC HIDL 1.0為例&#xff0c;因為比較簡單&#xff0c;代碼量也比較小&#xff0c;其源碼路徑&#xff1a;vendor/hardware/interfaces/nfc/1.0/ 1、NFC HAL的定義 1&#xff09;NFC HAL數據類型 通常定…

Vue自定義指令-防抖節流

Vue2版本 // 防抖 // <el-button v-debounce"[reset,click,300]" ></el-button> // <el-button v-debounce"[reset]" ></el-button> Vue.directive(debounce, { inserted: function (el, binding) { let [fn, event "cl…