blob: 9d46c3c657eb903688586633273199b82a4130de [file] [log] [blame] [view]
<!--
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
-->
# RESTful API V1(Not Recommend)
IoTDB's RESTful services can be used for query, write, and management operations, using the OpenAPI standard to define interfaces and generate frameworks.
## Enable RESTful Services
RESTful services are disabled by default.
Find the `conf/conf/iotdb-system.properties` file under the IoTDB installation directory and set `enable_rest_service` to `true` to enable the module.
```properties
enable_rest_service=true
```
## Authentication
Except the liveness probe API `/ping`, RESTful services use the basic authentication. Each URL request needs to carry `'Authorization': 'Basic ' + base64.encode(username + ':' + password)`.
The username used in the following examples is: `root`, and password is: `root`.
And the authorization header is
```
Authorization: Basic cm9vdDpyb290
```
- If a user authorized with incorrect username or password, the following error is returned:
HTTP Status Code:`401`
HTTP response body:
```json
{
"code": 600,
"message": "WRONG_LOGIN_PASSWORD_ERROR"
}
```
- If the `Authorization` header is missing,the following error is returned:
HTTP Status Code:`401`
HTTP response body:
```json
{
"code": 603,
"message": "UNINITIALIZED_AUTH_ERROR"
}
```
## Interface
### ping
The `/ping` API can be used for service liveness probing.
Request method: `GET`
Request path: `http://ip:port/ping`
The user name used in the example is: root, password: root
Example request:
```shell
$ curl http://127.0.0.1:18080/ping
```
Response status codes:
- `200`: The service is alive.
- `503`: The service cannot accept any requests now.
Response parameters:
| parameter name | parameter type | parameter describe |
| :------------- | :------------- | :----------------- |
| code | integer | status code |
| message | string | message |
Sample response:
- With HTTP status code `200`:
```json
{
"code": 200,
"message": "SUCCESS_STATUS"
}
```
- With HTTP status code `503`:
```json
{
"code": 500,
"message": "thrift service is unavailable"
}
```
> `/ping` can be accessed without authorization.
### query
The query interface can be used to handle data queries and metadata queries.
Request method: `POST`
Request header: `application/json`
Request path: `http://ip:port/rest/v1/query`
Parameter Description:
| parameter name | parameter type | required | parameter description |
| -------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sql | string | yes | |
| rowLimit | integer | no | The maximum number of rows in the result set that can be returned by a query. <br />If this parameter is not set, the `rest_query_default_row_size_limit` of the configuration file will be used as the default value. <br /> When the number of rows in the returned result set exceeds the limit, the status code `411` will be returned. |
Response parameters:
| parameter name | parameter type | parameter description |
| -------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| expressions | array | Array of result set column names for data query, `null` for metadata query |
| columnNames | array | Array of column names for metadata query result set, `null` for data query |
| timestamps | array | Timestamp column, `null` for metadata query |
| values | array | A two-dimensional array, the first dimension has the same length as the result set column name array, and the second dimension array represents a column of the result set |
**Examples:**
Tip: Statements like `select * from root.xx.**` are not recommended because those statements may cause OOM.
**Expression query**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select s3, s4, s3 + 1 from root.sg27 limit 2"}' http://127.0.0.1:18080/rest/v1/query
```
Response instance
```json
{
"expressions": ["root.sg27.s3", "root.sg27.s4", "root.sg27.s3 + 1"],
"columnNames": null,
"timestamps": [1635232143960, 1635232153960],
"values": [
[11, null],
[false, true],
[12.0, null]
]
}
```
**Show child paths**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show child paths root"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["child paths"],
"timestamps": null,
"values": [["root.sg27", "root.sg28"]]
}
```
**Show child nodes**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show child nodes root"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["child nodes"],
"timestamps": null,
"values": [["sg27", "sg28"]]
}
```
**Show all ttl**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show all ttl"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["database", "ttl"],
"timestamps": null,
"values": [
["root.sg27", "root.sg28"],
[null, null]
]
}
```
**Show ttl**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show ttl on root.sg27"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["database", "ttl"],
"timestamps": null,
"values": [["root.sg27"], [null]]
}
```
**Show functions**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show functions"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": [
"function name",
"function type",
"class name (UDF)"
],
"timestamps": null,
"values": [
[
"ABS",
"ACOS",
"ASIN",
...
],
[
"built-in UDTF",
"built-in UDTF",
"built-in UDTF",
...
],
[
"org.apache.iotdb.db.query.udf.builtin.UDTFAbs",
"org.apache.iotdb.db.query.udf.builtin.UDTFAcos",
"org.apache.iotdb.db.query.udf.builtin.UDTFAsin",
...
]
]
}
```
**Show timeseries**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show timeseries"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": [
"timeseries",
"alias",
"database",
"dataType",
"encoding",
"compression",
"tags",
"attributes"
],
"timestamps": null,
"values": [
["root.sg27.s3", "root.sg27.s4", "root.sg28.s3", "root.sg28.s4"],
[null, null, null, null],
["root.sg27", "root.sg27", "root.sg28", "root.sg28"],
["INT32", "BOOLEAN", "INT32", "BOOLEAN"],
["RLE", "RLE", "RLE", "RLE"],
["SNAPPY", "SNAPPY", "SNAPPY", "SNAPPY"],
[null, null, null, null],
[null, null, null, null]
]
}
```
**Show latest timeseries**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show latest timeseries"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": [
"timeseries",
"alias",
"database",
"dataType",
"encoding",
"compression",
"tags",
"attributes"
],
"timestamps": null,
"values": [
["root.sg28.s4", "root.sg27.s4", "root.sg28.s3", "root.sg27.s3"],
[null, null, null, null],
["root.sg28", "root.sg27", "root.sg28", "root.sg27"],
["BOOLEAN", "BOOLEAN", "INT32", "INT32"],
["RLE", "RLE", "RLE", "RLE"],
["SNAPPY", "SNAPPY", "SNAPPY", "SNAPPY"],
[null, null, null, null],
[null, null, null, null]
]
}
```
**Count timeseries**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"count timeseries root.**"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["count"],
"timestamps": null,
"values": [[4]]
}
```
**Count nodes**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"count nodes root.** level=2"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["count"],
"timestamps": null,
"values": [[4]]
}
```
**Show devices**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show devices"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["devices", "isAligned"],
"timestamps": null,
"values": [
["root.sg27", "root.sg28"],
["false", "false"]
]
}
```
**Show devices with database**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show devices with database"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["devices", "database", "isAligned"],
"timestamps": null,
"values": [
["root.sg27", "root.sg28"],
["root.sg27", "root.sg28"],
["false", "false"]
]
}
```
**List user**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"list user"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["user"],
"timestamps": null,
"values": [["root"]]
}
```
**Aggregation**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select count(*) from root.sg27"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": ["count(root.sg27.s3)", "count(root.sg27.s4)"],
"columnNames": null,
"timestamps": [0],
"values": [[1], [2]]
}
```
**Group by level**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select count(*) from root.** group by level = 1"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["count(root.sg27.*)", "count(root.sg28.*)"],
"timestamps": null,
"values": [[3], [3]]
}
```
**Group by**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select count(*) from root.sg27 group by([1635232143960,1635232153960),1s)"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": ["count(root.sg27.s3)", "count(root.sg27.s4)"],
"columnNames": null,
"timestamps": [
1635232143960, 1635232144960, 1635232145960, 1635232146960, 1635232147960,
1635232148960, 1635232149960, 1635232150960, 1635232151960, 1635232152960
],
"values": [
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
}
```
**Last**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select last s3 from root.sg27"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"expressions": null,
"columnNames": ["timeseries", "value", "dataType"],
"timestamps": [1635232143960],
"values": [["root.sg27.s3"], ["11"], ["INT32"]]
}
```
**Disable align**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select * from root.sg27 disable align"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"code": 407,
"message": "disable align clauses are not supported."
}
```
**Align by device**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select count(s3) from root.sg27 align by device"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"code": 407,
"message": "align by device clauses are not supported."
}
```
**Select into**
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"select s3, s4 into root.sg29.s1, root.sg29.s2 from root.sg27"}' http://127.0.0.1:18080/rest/v1/query
```
```json
{
"code": 407,
"message": "select into clauses are not supported."
}
```
### nonQuery
Request method: `POST`
Request header: `application/json`
Request path: `http://ip:port/rest/v1/nonQuery`
Parameter Description:
| parameter name | parameter type | parameter describe |
| :------------- | :------------- | :----------------- |
| sql | string | query content |
Example request:
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"CREATE DATABASE root.ln"}' http://127.0.0.1:18080/rest/v1/nonQuery
```
Response parameters:
| parameter name | parameter type | parameter describe |
| :------------- | :------------- | :----------------- |
| code | integer | status code |
| message | string | message |
Sample response:
```json
{
"code": 200,
"message": "SUCCESS_STATUS"
}
```
### insertTablet
Request method: `POST`
Request header: `application/json`
Request path: `http://ip:port/rest/v1/insertTablet`
Parameter Description:
| parameter name | parameter type | is required | parameter describe |
| :------------- | :------------- | :---------- | :----------------------------------------------------- |
| timestamps | array | yes | Time column |
| measurements | array | yes | The name of the measuring point |
| dataTypes | array | yes | The data type |
| values | array | yes | Value columns, the values in each column can be `null` |
| isAligned | boolean | yes | Whether to align the timeseries |
| deviceId | string | yes | Device name |
Example request:
```shell
curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"timestamps":[1635232143960,1635232153960],"measurements":["s3","s4"],"dataTypes":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"isAligned":false,"deviceId":"root.sg27"}' http://127.0.0.1:18080/rest/v1/insertTablet
```
Sample response:
| parameter name | parameter type | parameter describe |
| :------------- | :------------- | :----------------- |
| code | integer | status code |
| message | string | message |
Sample response:
```json
{
"code": 200,
"message": "SUCCESS_STATUS"
}
```
## Configuration
The configuration is located in 'iotdb-system.properties'.
- Set 'enable_rest_service' to 'true' to enable the module, and 'false' to disable the module. By default, this value is' false '.
```properties
enable_rest_service=true
```
- This parameter is valid only when 'enable_REST_service =true'. Set 'rest_service_port' to a number (1025 to 65535) to customize the REST service socket port. By default, the value is 18080.
```properties
rest_service_port=18080
```
- Set 'enable_swagger' to 'true' to display rest service interface information through swagger, and 'false' to do not display the rest service interface information through the swagger. By default, this value is' false '.
```properties
enable_swagger=false
```
- The maximum number of rows in the result set that can be returned by a query. When the number of rows in the returned result set exceeds the limit, the status code `411` is returned.
```properties
rest_query_default_row_size_limit=10000
```
- Expiration time for caching customer login information (used to speed up user authentication, in seconds, 8 hours by default)
```properties
cache_expire=28800
```
- Maximum number of users stored in the cache (default: 100)
```properties
cache_max_num=100
```
- Initial cache size (default: 10)
```properties
cache_init_num=10
```
- REST Service whether to enable SSL configuration, set 'enable_https' to' true 'to enable the module, and set' false 'to disable the module. By default, this value is' false '.
```properties
enable_https=false
```
- keyStore location path (optional)
```properties
key_store_path=
```
- keyStore password (optional)
```properties
key_store_pwd=
```
- trustStore location path (optional)
```properties
trust_store_path=
```
- trustStore password (optional)
```properties
trust_store_pwd=
```
- SSL timeout period, in seconds
```properties
idle_timeout=5000
```