You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2023/03/29 05:38:27 UTC

[iotdb] 03/03: [IOTDB-5687][REST Service] OpenAPI v2 interface (#9472)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch iotdb-5687-1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 7dd92f75665e60190af3ce0f2007129d900d7068
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Wed Mar 29 13:38:00 2023 +0800

    [IOTDB-5687][REST Service] OpenAPI v2 interface (#9472)
---
 .../API/{RestService.md => RestServiceV1.md}       | 46 ++++++++--------
 .../API/{RestService.md => RestServiceV2.md}       | 50 ++++++++---------
 docs/UserGuide/Query-Data/Overview.md              |  2 +-
 docs/UserGuide/Write-Data/REST-API.md              |  2 +-
 .../API/{RestService.md => RestServiceV1.md}       | 46 ++++++++--------
 .../API/{RestService.md => RestServiceV2.md}       | 50 ++++++++---------
 docs/zh/UserGuide/Query-Data/Overview.md           |  2 +-
 docs/zh/UserGuide/Write-Data/REST-API.md           |  2 +-
 grafana-plugin/pkg/plugin/plugin.go                |  8 +--
 openapi/pom.xml                                    | 56 ++++++++++++++++++-
 openapi/src/main/openapi3/iotdb_rest_common.yaml   | 63 ++++++++++++++++++++++
 .../{iotdb-rest.yaml => iotdb_rest_v1.yaml}        | 35 +++++-------
 .../{iotdb-rest.yaml => iotdb_rest_v2.yaml}        | 35 +++++-------
 .../rest/handler/AuthorizationHandler.java         |  8 ++-
 .../rest/{ => v1}/handler/ExceptionHandler.java    | 10 ++--
 .../{ => v1}/handler/ExecuteStatementHandler.java  |  2 +-
 .../rest/{ => v1}/handler/QueryDataSetHandler.java | 24 ++++-----
 .../{ => v1}/handler/RequestValidationHandler.java | 22 ++++----
 .../handler/StatementConstructionHandler.java      |  6 +--
 .../rest/{ => v1}/impl/GrafanaApiServiceImpl.java  | 25 ++++-----
 .../rest/{ => v1}/impl/RestApiServiceImpl.java     | 20 +++----
 .../rest/{ => v2}/handler/ExceptionHandler.java    |  2 +-
 .../{ => v2}/handler/ExecuteStatementHandler.java  |  2 +-
 .../rest/{ => v2}/handler/QueryDataSetHandler.java | 26 ++++-----
 .../{ => v2}/handler/RequestValidationHandler.java |  8 +--
 .../handler/StatementConstructionHandler.java      |  4 +-
 .../rest/{ => v2}/impl/GrafanaApiServiceImpl.java  | 25 ++++-----
 .../rest/{ => v2}/impl/RestApiServiceImpl.java     | 20 +++----
 site/src/main/.vuepress/config.js                  |  6 ++-
 29 files changed, 351 insertions(+), 256 deletions(-)

diff --git a/docs/UserGuide/API/RestService.md b/docs/UserGuide/API/RestServiceV1.md
similarity index 93%
copy from docs/UserGuide/API/RestService.md
copy to docs/UserGuide/API/RestServiceV1.md
index 9717cb55a3..2d4d2b8c5e 100644
--- a/docs/UserGuide/API/RestService.md
+++ b/docs/UserGuide/API/RestServiceV1.md
@@ -140,14 +140,14 @@ Parameter Description:
 | parameter name | parameter type | required | parameter description                                        |
 |----------------| -------------- | -------- | ------------------------------------------------------------ |
 | sql            | string         | yes      |                                                              |
-| row_limit      | 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. |
+| 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 |
-| column_names   | array          | Array of column names for metadata query result set, `null` for data 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 |
 
@@ -168,7 +168,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
     "root.sg27.s4",
     "root.sg27.s3 + 1"
   ],
-  "column_names": null,
+  "columnNames": null,
   "timestamps": [
     1635232143960,
     1635232153960
@@ -199,7 +199,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "child paths"
   ],
   "timestamps": null,
@@ -221,7 +221,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "child nodes"
   ],
   "timestamps": null,
@@ -243,7 +243,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "database",
     "ttl"
   ],
@@ -270,7 +270,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "database",
     "ttl"
   ],
@@ -295,7 +295,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "function name",
     "function type",
     "class name (UDF)"
@@ -333,7 +333,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "timeseries",
     "alias",
     "database",
@@ -406,7 +406,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "timeseries",
     "alias",
     "database",
@@ -479,7 +479,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "count"
   ],
   "timestamps": null,
@@ -500,7 +500,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "count"
   ],
   "timestamps": null,
@@ -521,7 +521,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "devices",
     "isAligned"
   ],
@@ -548,7 +548,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "devices",
     "database",
     "isAligned"
@@ -580,7 +580,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "user"
   ],
   "timestamps": null,
@@ -604,7 +604,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
     "count(root.sg27.s3)",
     "count(root.sg27.s4)"
   ],
-  "column_names": null,
+  "columnNames": null,
   "timestamps": [
     0
   ],
@@ -628,7 +628,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "count(root.sg27.*)",
     "count(root.sg28.*)"
   ],
@@ -656,7 +656,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
     "count(root.sg27.s3)",
     "count(root.sg27.s4)"
   ],
-  "column_names": null,
+  "columnNames": null,
   "timestamps": [
     1635232143960,
     1635232144960,
@@ -707,7 +707,7 @@ curl -H "Content-Type:application/json"  -H "Authorization:Basic cm9vdDpyb290" -
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "timeseries",
     "value",
     "dataType"
@@ -818,14 +818,14 @@ Parameter Description:
 |:---------------| :--- | :---| :---|
 | timestamps     | array | yes |  Time column  |
 | measurements   | array | yes  | The name of the measuring point |
-| data_types     | array | yes  | The data type |
+| dataTypes     | array | yes  | The data type |
 | values         | array | yes  | Value columns, the values in each column can be `null` |
-| is_aligned     | boolean | yes  | Whether to align the timeseries |
-| device         | string | yes  | Device name |
+| 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"],"data_types":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"is_aligned":false,"device":"root.sg27"}' http://127.0.0.1:18080/rest/v1/insertTablet
+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:
diff --git a/docs/UserGuide/API/RestService.md b/docs/UserGuide/API/RestServiceV2.md
similarity index 94%
rename from docs/UserGuide/API/RestService.md
rename to docs/UserGuide/API/RestServiceV2.md
index 9717cb55a3..0b3aa050cb 100644
--- a/docs/UserGuide/API/RestService.md
+++ b/docs/UserGuide/API/RestServiceV2.md
@@ -133,7 +133,7 @@ Request method: `POST`
 
 Request header: `application/json`
 
-Request path: http://ip:port/rest/v1/query
+Request path: http://ip:port/rest/v2/query
 
 Parameter Description:
 
@@ -158,7 +158,7 @@ Tip: Statements like `select * from root.xx.**` are not recommended because thos
 **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
+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/v2/query
 ````
 
 ```json
@@ -193,7 +193,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -215,7 +215,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -237,7 +237,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show all ttl"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -264,7 +264,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -289,7 +289,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show functions"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -327,7 +327,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show timeseries"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -400,7 +400,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show latest timeseries"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -473,7 +473,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"count timeseries root.**"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -494,7 +494,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -515,7 +515,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show devices"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -542,7 +542,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -574,7 +574,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"list user"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 ```json
@@ -595,7 +595,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -622,7 +622,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -647,7 +647,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -701,7 +701,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -732,7 +732,7 @@ curl -H "Content-Type:application/json"  -H "Authorization:Basic cm9vdDpyb290" -
 **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
+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/v2/query
 ```
 
 ```json
@@ -745,7 +745,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -758,7 +758,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 **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
+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/v2/query
 ```
 
 ```json
@@ -774,7 +774,7 @@ Request method: `POST`
 
 Request header: `application/json`
 
-Request path: http://ip:port/rest/v1/nonQuery
+Request path: http://ip:port/rest/v2/nonQuery
 
 Parameter Description:
 
@@ -784,7 +784,7 @@ Parameter Description:
 
 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
+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/v2/nonQuery
 ```
 
 Response parameters:
@@ -810,7 +810,7 @@ Request method: `POST`
 
 Request header: `application/json`
 
-Request path: http://ip:port/rest/v1/insertTablet
+Request path: http://ip:port/rest/v2/insertTablet
 
 Parameter Description:
 
@@ -825,7 +825,7 @@ Parameter Description:
 
 Example request:
 ```shell
-curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"timestamps":[1635232143960,1635232153960],"measurements":["s3","s4"],"data_types":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"is_aligned":false,"device":"root.sg27"}' http://127.0.0.1:18080/rest/v1/insertTablet
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"timestamps":[1635232143960,1635232153960],"measurements":["s3","s4"],"data_types":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"is_aligned":false,"device":"root.sg27"}' http://127.0.0.1:18080/rest/v2/insertTablet
 ```
 
 Sample response:
diff --git a/docs/UserGuide/Query-Data/Overview.md b/docs/UserGuide/Query-Data/Overview.md
index 3cb72cb0f6..f22f86f53a 100644
--- a/docs/UserGuide/Query-Data/Overview.md
+++ b/docs/UserGuide/Query-Data/Overview.md
@@ -286,7 +286,7 @@ Data query statements can be used in SQL command-line terminals, JDBC, JAVA / C+
    SessionDataSet executeQueryStatement(String sql)
    ````
 
-- Used in RESTful API, see [HTTP API](../API/RestService.md) for details.
+- Used in RESTful API, see [HTTP API V1](../API/RestServiceV1.md) or [HTTP API V2](../API/RestServiceV2.md) for details.
 
 ### Efficient execution interfaces
 
diff --git a/docs/UserGuide/Write-Data/REST-API.md b/docs/UserGuide/Write-Data/REST-API.md
index 71927c3dc5..603621aa5e 100644
--- a/docs/UserGuide/Write-Data/REST-API.md
+++ b/docs/UserGuide/Write-Data/REST-API.md
@@ -21,7 +21,7 @@
 
 # REST API Write
 
-Refer to [insertTablet](../API/RestService.md#inserttablet)
+Refer to [insertTablet (v1)](../API/RestServiceV1.md#inserttablet) or [insertTablet (v2)](../API/RestServiceV2.md#inserttablet)
 
 Example:
 
diff --git a/docs/zh/UserGuide/API/RestService.md b/docs/zh/UserGuide/API/RestServiceV1.md
similarity index 94%
copy from docs/zh/UserGuide/API/RestService.md
copy to docs/zh/UserGuide/API/RestServiceV1.md
index 5c9fac9ed1..6b3715247c 100644
--- a/docs/zh/UserGuide/API/RestService.md
+++ b/docs/zh/UserGuide/API/RestServiceV1.md
@@ -134,14 +134,14 @@ query 接口可以用于处理数据查询和元数据查询。
 | 参数名称      |参数类型  |是否必填|参数描述|
 |-----------| ------------ | ------------ |------------ |
 | sql       | string | 是  |   |
-| row_limit | integer | 否 | 一次查询能返回的结果集的最大行数。<br />如果不设置该参数,将使用配置文件的  `rest_query_default_row_size_limit` 作为默认值。<br />当返回结果集的行数超出限制时,将返回状态码 `411`。 |
+| rowLimit | integer | 否 | 一次查询能返回的结果集的最大行数。<br />如果不设置该参数,将使用配置文件的  `rest_query_default_row_size_limit` 作为默认值。<br />当返回结果集的行数超出限制时,将返回状态码 `411`。 |
 
 响应参数:
 
 | 参数名称         |参数类型  |参数描述|
 |--------------| ------------ | ------------|
 | expressions  | array | 用于数据查询时结果集列名的数组,用于元数据查询时为`null`|
-| column_names | array | 用于元数据查询结果集列名数组,用于数据查询时为`null` |
+| columnNames | array | 用于元数据查询结果集列名数组,用于数据查询时为`null` |
 | timestamps   | array | 时间戳列,用于元数据查询时为`null` |
 | values       |array|二维数组,第一维与结果集列名数组的长度相同,第二维数组代表结果集的一列|
 
@@ -163,7 +163,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
     "root.sg27.s4",
     "root.sg27.s3 + 1"
   ],
-  "column_names": null,
+  "columnNames": null,
   "timestamps": [
     1635232143960,
     1635232153960
@@ -195,7 +195,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "child paths"
   ],
   "timestamps": null,
@@ -218,7 +218,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "child nodes"
   ],
   "timestamps": null,
@@ -241,7 +241,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "database",
     "ttl"
   ],
@@ -269,7 +269,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "database",
     "ttl"
   ],
@@ -295,7 +295,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "function name",
     "function type",
     "class name (UDF)"
@@ -334,7 +334,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "timeseries",
     "alias",
     "database",
@@ -408,7 +408,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "timeseries",
     "alias",
     "database",
@@ -482,7 +482,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "count"
   ],
   "timestamps": null,
@@ -504,7 +504,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "count"
   ],
   "timestamps": null,
@@ -526,7 +526,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "devices",
     "isAligned"
   ],
@@ -554,7 +554,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "devices",
     "database",
     "isAligned"
@@ -587,7 +587,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "user"
   ],
   "timestamps": null,
@@ -612,7 +612,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
     "count(root.sg27.s3)",
     "count(root.sg27.s4)"
   ],
-  "column_names": null,
+  "columnNames": null,
   "timestamps": [
     0
   ],
@@ -637,7 +637,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "count(root.sg27.*)",
     "count(root.sg28.*)"
   ],
@@ -666,7 +666,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
     "count(root.sg27.s3)",
     "count(root.sg27.s4)"
   ],
-  "column_names": null,
+  "columnNames": null,
   "timestamps": [
     1635232143960,
     1635232144960,
@@ -718,7 +718,7 @@ curl -H "Content-Type:application/json"  -H "Authorization:Basic cm9vdDpyb290" -
 ```json
 {
   "expressions": null,
-  "column_names": [
+  "columnNames": [
     "timeseries",
     "value",
     "dataType"
@@ -832,14 +832,14 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 |--------------| ------------ | ------------ |------------ |
 | timestamps   | array | 是 |  时间列  |
 | measurements | array | 是  | 测点名称 |
-| data_types   | array | 是  | 数据类型  |
+| dataTypes   | array | 是  | 数据类型  |
 | values       | array | 是  | 值列,每一列中的值可以为 `null` |
-| is_aligned   | boolean | 是  | 是否是对齐时间序列 |
-| device       | string | 是  | 设备名称 |
+| isAligned   | boolean | 是  | 是否是对齐时间序列 |
+| deviceId       | string | 是  | 设备名称 |
 
 请求示例:
 ```shell
-curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"timestamps":[1635232143960,1635232153960],"measurements":["s3","s4"],"data_types":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"is_aligned":false,"device":"root.sg27"}' http://127.0.0.1:18080/rest/v1/insertTablet
+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
 ```
 
 响应参数:
diff --git a/docs/zh/UserGuide/API/RestService.md b/docs/zh/UserGuide/API/RestServiceV2.md
similarity index 94%
rename from docs/zh/UserGuide/API/RestService.md
rename to docs/zh/UserGuide/API/RestServiceV2.md
index 5c9fac9ed1..8986d629e9 100644
--- a/docs/zh/UserGuide/API/RestService.md
+++ b/docs/zh/UserGuide/API/RestServiceV2.md
@@ -127,7 +127,7 @@ query 接口可以用于处理数据查询和元数据查询。
 
 请求头:`application/json`
 
-请求路径:http://ip:port/rest/v1/query
+请求路径:http://ip:port/rest/v2/query
 
 参数说明:
 
@@ -151,7 +151,7 @@ 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
+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/v2/query
 ```
 
 响应示例:
@@ -187,7 +187,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -210,7 +210,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -233,7 +233,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show all ttl"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -261,7 +261,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -287,7 +287,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show functions"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -326,7 +326,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show timeseries"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -400,7 +400,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show latest timeseries"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -474,7 +474,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"count timeseries root.**"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -496,7 +496,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -518,7 +518,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"show devices"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -546,7 +546,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -579,7 +579,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"sql":"list user"}' http://127.0.0.1:18080/rest/v2/query
 ```
 
 响应示例:
@@ -601,7 +601,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 原始聚合查询:
 ```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
+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/v2/query
 ```
 
 响应示例:
@@ -629,7 +629,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -655,7 +655,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -710,7 +710,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -742,7 +742,7 @@ curl -H "Content-Type:application/json"  -H "Authorization:Basic cm9vdDpyb290" -
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -756,7 +756,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -770,7 +770,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例 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
+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/v2/query
 ```
 
 响应示例:
@@ -788,7 +788,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求头:`application/json`
 
-请求路径:http://ip:port/rest/v1/nonQuery
+请求路径:http://ip:port/rest/v2/nonQuery
 
 参数说明:
 
@@ -798,7 +798,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例:
 ```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
+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/v2/nonQuery
 ```
 
 响应参数:
@@ -824,7 +824,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求头:`application/json`
 
-请求路径:http://ip:port/rest/v1/insertTablet
+请求路径:http://ip:port/rest/v2/insertTablet
 
 参数说明:
 
@@ -839,7 +839,7 @@ curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X
 
 请求示例:
 ```shell
-curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"timestamps":[1635232143960,1635232153960],"measurements":["s3","s4"],"data_types":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"is_aligned":false,"device":"root.sg27"}' http://127.0.0.1:18080/rest/v1/insertTablet
+curl -H "Content-Type:application/json" -H "Authorization:Basic cm9vdDpyb290" -X POST --data '{"timestamps":[1635232143960,1635232153960],"measurements":["s3","s4"],"data_types":["INT32","BOOLEAN"],"values":[[11,null],[false,true]],"is_aligned":false,"device":"root.sg27"}' http://127.0.0.1:18080/rest/v2/insertTablet
 ```
 
 响应参数:
diff --git a/docs/zh/UserGuide/Query-Data/Overview.md b/docs/zh/UserGuide/Query-Data/Overview.md
index a4cdcfd690..8b45276b60 100644
--- a/docs/zh/UserGuide/Query-Data/Overview.md
+++ b/docs/zh/UserGuide/Query-Data/Overview.md
@@ -294,7 +294,7 @@ It costs 0.016s
   SessionDataSet executeQueryStatement(String sql);
   ```
 
-- 在 RESTful API 中使用,详见 [HTTP API](../API/RestService.md) 。
+- 在 RESTful API 中使用,详见 [HTTP API V1](../API/RestServiceV1.md) 或者 [HTTP API V2](../API/RestServiceV2.md)。
 
 #### 常用查询的高效执行接口
 
diff --git a/docs/zh/UserGuide/Write-Data/REST-API.md b/docs/zh/UserGuide/Write-Data/REST-API.md
index 4d69fea047..936a268fd9 100644
--- a/docs/zh/UserGuide/Write-Data/REST-API.md
+++ b/docs/zh/UserGuide/Write-Data/REST-API.md
@@ -21,7 +21,7 @@
 
 ## REST API写入
 
-参考 [insertTablet](../API/RestService.md#inserttablet)
+参考 [insertTablet (v1)](../API/RestServiceV1.md#inserttablet) or [insertTablet (v2)](../API/RestServiceV2.md#inserttablet)
 
 示例如下:
 ```JSON
diff --git a/grafana-plugin/pkg/plugin/plugin.go b/grafana-plugin/pkg/plugin/plugin.go
index 514bc08fc6..89334a9dd3 100644
--- a/grafana-plugin/pkg/plugin/plugin.go
+++ b/grafana-plugin/pkg/plugin/plugin.go
@@ -138,9 +138,9 @@ type queryParam struct {
 
 type QueryDataReq struct {
 	Expression []string `json:"expression"`
-	PrefixPath []string `json:"prefix_path"`
-	StartTime  int64    `json:"start_time"`
-	EndTime    int64    `json:"end_time"`
+	PrefixPath []string `json:"prefixPath"`
+	StartTime  int64    `json:"startTime"`
+	EndTime    int64    `json:"endTime"`
 	Condition  string   `json:"condition"`
 	Control    string   `json:"control"`
 }
@@ -149,7 +149,7 @@ type QueryDataResponse struct {
 	Expressions []string        `json:"expressions"`
 	Timestamps  []int64         `json:"timestamps"`
 	Values      [][]interface{} `json:"values"`
-	ColumnNames interface{}     `json:"column_names"`
+	ColumnNames interface{}     `json:"columnNames"`
 	Code        int32           `json:"code"`
 	Message     string          `json:"message"`
 }
diff --git a/openapi/pom.xml b/openapi/pom.xml
index 9f54c8619c..bcc19aca2f 100644
--- a/openapi/pom.xml
+++ b/openapi/pom.xml
@@ -90,12 +90,12 @@
                         <version>${openapi.generator.version}</version>
                         <executions>
                             <execution>
-                                <id>generate-java-rest-codes</id>
+                                <id>generate-java-rest-codes-common</id>
                                 <goals>
                                     <goal>generate</goal>
                                 </goals>
                                 <configuration>
-                                    <inputSpec>${project.basedir}/src/main/openapi3/iotdb-rest.yaml</inputSpec>
+                                    <inputSpec>${project.basedir}/src/main/openapi3/iotdb_rest_common.yaml</inputSpec>
                                     <output>${project.build.directory}/generated-sources/java</output>
                                     <apiPackage>org.apache.iotdb.db.protocol.rest</apiPackage>
                                     <modelPackage>org.apache.iotdb.db.protocol.rest.model</modelPackage>
@@ -115,6 +115,58 @@
                                     </configOptions>
                                 </configuration>
                             </execution>
+                            <execution>
+                                <id>generate-java-rest-codes-v1</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <inputSpec>${project.basedir}/src/main/openapi3/iotdb_rest_v1.yaml</inputSpec>
+                                    <output>${project.build.directory}/generated-sources/java</output>
+                                    <apiPackage>org.apache.iotdb.db.protocol.rest.v1</apiPackage>
+                                    <modelPackage>org.apache.iotdb.db.protocol.rest.v1.model</modelPackage>
+                                    <invokerPackage>org.apache.iotdb.db.protocol.rest.v1.invoker</invokerPackage>
+                                    <generatorName>jaxrs-jersey</generatorName>
+                                    <groupId>org.apache.iotdb</groupId>
+                                    <artifactId>iotdb-rest-service</artifactId>
+                                    <artifactVersion>${project.version}</artifactVersion>
+                                    <addCompileSourceRoot>true</addCompileSourceRoot>
+                                    <configOptions>
+                                        <licenseName>Apache License 2.0</licenseName>
+                                        <groupId>org.apache.iotdb</groupId>
+                                        <artifactId>iotdb-rest-service</artifactId>
+                                        <artifactVersion>${project.version}</artifactVersion>
+                                        <dateLibrary>java8</dateLibrary>
+                                        <useGzipFeature>true</useGzipFeature>
+                                    </configOptions>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>generate-java-rest-codes-v2</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <inputSpec>${project.basedir}/src/main/openapi3/iotdb_rest_v2.yaml</inputSpec>
+                                    <output>${project.build.directory}/generated-sources/java</output>
+                                    <apiPackage>org.apache.iotdb.db.protocol.rest.v2</apiPackage>
+                                    <modelPackage>org.apache.iotdb.db.protocol.rest.v2.model</modelPackage>
+                                    <invokerPackage>org.apache.iotdb.db.protocol.rest.v2.invoker</invokerPackage>
+                                    <generatorName>jaxrs-jersey</generatorName>
+                                    <groupId>org.apache.iotdb</groupId>
+                                    <artifactId>iotdb-rest-service</artifactId>
+                                    <artifactVersion>${project.version}</artifactVersion>
+                                    <addCompileSourceRoot>true</addCompileSourceRoot>
+                                    <configOptions>
+                                        <licenseName>Apache License 2.0</licenseName>
+                                        <groupId>org.apache.iotdb</groupId>
+                                        <artifactId>iotdb-rest-service</artifactId>
+                                        <artifactVersion>${project.version}</artifactVersion>
+                                        <dateLibrary>java8</dateLibrary>
+                                        <useGzipFeature>true</useGzipFeature>
+                                    </configOptions>
+                                </configuration>
+                            </execution>
                         </executions>
                     </plugin>
                 </plugins>
diff --git a/openapi/src/main/openapi3/iotdb_rest_common.yaml b/openapi/src/main/openapi3/iotdb_rest_common.yaml
new file mode 100644
index 0000000000..c868139408
--- /dev/null
+++ b/openapi/src/main/openapi3/iotdb_rest_common.yaml
@@ -0,0 +1,63 @@
+#
+# 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.
+#
+
+openapi: 3.0.0
+info:
+  title: iotdb_rest_common
+  description: IoTDB Rest API for Grafana, Prometheus, etc..
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0.html
+  version: 1.0.0
+servers:
+- url: http://127.0.0.1:18080/
+  description: api
+security:
+- basic: []
+paths:
+  /ping:
+    get:
+      responses:
+        "200":
+          description: ExecutionStatus
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ExecutionStatus'
+      operationId: tryPing
+
+components:
+  schemas:
+    ExecutionStatus:
+      type: object
+      properties:
+        code:
+          type: integer
+          format: int32
+        message:
+          type: string
+
+  securitySchemes:
+    basic:
+      type: http
+      scheme: basic
+    APIKey:
+      type: apiKey
+      name: API Key
+      in: header
diff --git a/openapi/src/main/openapi3/iotdb-rest.yaml b/openapi/src/main/openapi3/iotdb_rest_v1.yaml
similarity index 92%
copy from openapi/src/main/openapi3/iotdb-rest.yaml
copy to openapi/src/main/openapi3/iotdb_rest_v1.yaml
index b9cd29ff2c..18080c693a 100644
--- a/openapi/src/main/openapi3/iotdb-rest.yaml
+++ b/openapi/src/main/openapi3/iotdb_rest_v1.yaml
@@ -26,22 +26,11 @@ info:
     url: https://www.apache.org/licenses/LICENSE-2.0.html
   version: 1.0.0
 servers:
-- url: http://127.0.0.1:18080/
-  description: api
+  - url: http://127.0.0.1:18080/
+    description: api
 security:
-- basic: []
+  - basic: []
 paths:
-  /ping:
-    get:
-      responses:
-        "200":
-          description: ExecutionStatus
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ExecutionStatus'
-      operationId: tryPing
-
   /rest/v1/insertTablet:
     post:
       summary: insertTablet
@@ -174,7 +163,7 @@ components:
       properties:
         sql:
           type: string
-        row_limit:
+        rowLimit:
           type: integer
           format: int32
 
@@ -191,7 +180,7 @@ components:
           type: array
           items:
             type: string
-        data_types:
+        dataTypes:
           type: array
           items:
             type: string
@@ -201,9 +190,9 @@ components:
             type: array
             items:
               type: object
-        is_aligned:
+        isAligned:
           type: boolean
-        device:
+        deviceId:
           type: string
 
     ExecutionStatus:
@@ -222,7 +211,7 @@ components:
           type: array
           items:
             type: string
-        column_names:
+        columnNames:
           type: array
           items:
             type: string
@@ -245,17 +234,17 @@ components:
           type: array
           items:
             type: string
-        prefix_path:
+        prefixPath:
           type: array
           items:
             type: string
         condition:
           type: string
         control:
-           type: string
-        start_time:
+          type: string
+        startTime:
           type: number
-        end_time:
+        endTime:
           type: number
 
     VariablesResult:
diff --git a/openapi/src/main/openapi3/iotdb-rest.yaml b/openapi/src/main/openapi3/iotdb_rest_v2.yaml
similarity index 92%
rename from openapi/src/main/openapi3/iotdb-rest.yaml
rename to openapi/src/main/openapi3/iotdb_rest_v2.yaml
index b9cd29ff2c..4dfdb14cb9 100644
--- a/openapi/src/main/openapi3/iotdb-rest.yaml
+++ b/openapi/src/main/openapi3/iotdb_rest_v2.yaml
@@ -19,30 +19,19 @@
 
 openapi: 3.0.0
 info:
-  title: iotdb-rest
+  title: iotdb_rest_v2
   description: IoTDB Rest API for Grafana, Prometheus, etc..
   license:
     name: Apache 2.0
     url: https://www.apache.org/licenses/LICENSE-2.0.html
   version: 1.0.0
 servers:
-- url: http://127.0.0.1:18080/
-  description: api
+  - url: http://127.0.0.1:18080/
+    description: api
 security:
-- basic: []
+  - basic: []
 paths:
-  /ping:
-    get:
-      responses:
-        "200":
-          description: ExecutionStatus
-          content:
-            application/json:
-              schema:
-                $ref: '#/components/schemas/ExecutionStatus'
-      operationId: tryPing
-
-  /rest/v1/insertTablet:
+  /rest/v2/insertTablet:
     post:
       summary: insertTablet
       description: insertTablet
@@ -60,7 +49,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/ExecutionStatus'
 
-  /rest/v1/nonQuery:
+  /rest/v2/nonQuery:
     post:
       summary: executeNonQueryStatement
       description: executeNonQueryStatement
@@ -78,7 +67,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/ExecutionStatus'
 
-  /rest/v1/query:
+  /rest/v2/query:
     post:
       summary: executeQueryStatement
       description: executeQueryStatement
@@ -96,7 +85,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/QueryDataSet'
 
-  /grafana/v1/login:
+  /grafana/v2/login:
     get:
       responses:
         "200":
@@ -107,7 +96,7 @@ paths:
                 $ref: '#/components/schemas/ExecutionStatus'
       operationId: login
 
-  /grafana/v1/query/expression:
+  /grafana/v2/query/expression:
     post:
       summary: expression
       description: expression
@@ -125,7 +114,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/QueryDataSet'
 
-  /grafana/v1/variable:
+  /grafana/v2/variable:
     post:
       summary: variables
       description: variables
@@ -143,7 +132,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/VariablesResult'
 
-  /grafana/v1/node:
+  /grafana/v2/node:
     post:
       summary: node
       description: node
@@ -252,7 +241,7 @@ components:
         condition:
           type: string
         control:
-           type: string
+          type: string
         start_time:
           type: number
         end_time:
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/AuthorizationHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/AuthorizationHandler.java
index 289b9fc523..8f6f441b5c 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/AuthorizationHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/AuthorizationHandler.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.SecurityContext;
 
 public class AuthorizationHandler {
@@ -40,7 +41,12 @@ public class AuthorizationHandler {
             .build();
       }
     } catch (AuthException e) {
-      return Response.ok().entity(ExceptionHandler.tryCatchException(e)).build();
+      return Response.ok()
+          .entity(
+              new ExecutionStatus()
+                  .message(e.getMessage())
+                  .code(Status.BAD_REQUEST.getStatusCode()))
+          .build();
     }
     return null;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/ExceptionHandler.java
similarity index 92%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/ExceptionHandler.java
index 5cc980fcc5..862f799961 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/ExceptionHandler.java
@@ -15,18 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v1.handler;
 
 import org.apache.iotdb.commons.auth.AuthException;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.IoTDBException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.db.exception.StorageEngineException;
-import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
+import org.apache.iotdb.db.exception.metadata.DatabaseNotSetException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.exception.sql.StatementAnalyzeException;
-import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
+import org.apache.iotdb.db.protocol.rest.v1.model.ExecutionStatus;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.antlr.v4.runtime.misc.ParseCancellationException;
@@ -47,9 +47,9 @@ public class ExceptionHandler {
     if (e instanceof QueryProcessException) {
       responseResult.setMessage(e.getMessage());
       responseResult.setCode(((QueryProcessException) e).getErrorCode());
-    } else if (e instanceof StorageGroupNotSetException) {
+    } else if (e instanceof DatabaseNotSetException) {
       responseResult.setMessage(e.getMessage());
-      responseResult.setCode(((StorageGroupNotSetException) e).getErrorCode());
+      responseResult.setCode(((DatabaseNotSetException) e).getErrorCode());
     } else if (e instanceof StorageEngineException) {
       responseResult.setMessage(e.getMessage());
       responseResult.setCode(((StorageEngineException) e).getErrorCode());
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/ExecuteStatementHandler.java
similarity index 97%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/ExecuteStatementHandler.java
index d7f7841167..e72c255631 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/ExecuteStatementHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v1.handler;
 
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.StatementType;
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java
similarity index 92%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java
index 14f54c7a37..e61075ea11 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v1.handler;
 
 import org.apache.iotdb.commons.exception.IoTDBException;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
@@ -25,7 +25,7 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildPathsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
-import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
+import org.apache.iotdb.db.protocol.rest.v1.model.ExecutionStatus;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -72,8 +72,8 @@ public class QueryDataSetHandler {
   public static Response fillDataSetWithTimestamps(
       IQueryExecution queryExecution, final int actualRowSizeLimit, final long timePrecision)
       throws IoTDBException {
-    org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
-        new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
+    org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet =
+        new org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet();
 
     return fillQueryDataSetWithTimestamps(
         queryExecution, actualRowSizeLimit, targetDataSet, timePrecision);
@@ -82,8 +82,8 @@ public class QueryDataSetHandler {
   public static Response fillAggregationPlanDataSet(
       IQueryExecution queryExecution, final int actualRowSizeLimit) throws IoTDBException {
 
-    org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
-        new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
+    org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet =
+        new org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet();
 
     DatasetHeader datasetHeader = queryExecution.getDatasetHeader();
 
@@ -97,8 +97,8 @@ public class QueryDataSetHandler {
 
   private static Response fillShowPlanDataSet(
       IQueryExecution queryExecution, final int actualRowSizeLimit) throws IoTDBException {
-    org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
-        new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
+    org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet =
+        new org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet();
     initTargetDatasetOrderByOrderWithSourceDataSet(
         queryExecution.getDatasetHeader(), targetDataSet);
 
@@ -107,7 +107,7 @@ public class QueryDataSetHandler {
 
   private static void initTargetDatasetOrderByOrderWithSourceDataSet(
       DatasetHeader datasetHeader,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet) {
+      org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet) {
     if (datasetHeader.getRespColumns() != null) {
       for (int i = 0; i < datasetHeader.getRespColumns().size(); i++) {
         targetDataSet.addColumnNamesItem(datasetHeader.getRespColumns().get(i));
@@ -119,7 +119,7 @@ public class QueryDataSetHandler {
   private static void initTargetDatasetExpByOrderWithSourceDataSet(
       QueryDataSet sourceDataSet,
       int[] targetDataSetIndexToSourceDataSetIndex,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet) {
+      org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet) {
     if (sourceDataSet.getPaths() != null) {
       for (int i = 0; i < sourceDataSet.getPaths().size(); i++) {
         Path path = sourceDataSet.getPaths().get(i);
@@ -133,7 +133,7 @@ public class QueryDataSetHandler {
   private static Response fillQueryDataSetWithTimestamps(
       IQueryExecution queryExecution,
       int actualRowSizeLimit,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet,
+      org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet,
       final long timePrecision)
       throws IoTDBException {
     int fetched = 0;
@@ -202,7 +202,7 @@ public class QueryDataSetHandler {
   private static Response fillQueryDataSetWithoutTimestamps(
       IQueryExecution queryExecution,
       int actualRowSizeLimit,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet)
+      org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet)
       throws IoTDBException {
     int fetched = 0;
     int columnNum = queryExecution.getOutputValueColumnCount();
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/RequestValidationHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/RequestValidationHandler.java
similarity index 74%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/RequestValidationHandler.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/RequestValidationHandler.java
index 27b77596a5..32e97d36fe 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/RequestValidationHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/RequestValidationHandler.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v1.handler;
 
-import org.apache.iotdb.db.protocol.rest.model.ExpressionRequest;
-import org.apache.iotdb.db.protocol.rest.model.InsertTabletRequest;
-import org.apache.iotdb.db.protocol.rest.model.SQL;
+import org.apache.iotdb.db.protocol.rest.v1.model.ExpressionRequest;
+import org.apache.iotdb.db.protocol.rest.v1.model.InsertTabletRequest;
+import org.apache.iotdb.db.protocol.rest.v1.model.SQL;
 
 import org.apache.commons.lang3.Validate;
 
@@ -32,22 +32,22 @@ public class RequestValidationHandler {
   public static void validateSQL(SQL sql) {
     Objects.requireNonNull(sql.getSql(), "sql should not be null");
     if (sql.getRowLimit() != null) {
-      Validate.isTrue(sql.getRowLimit() > 0, "row_limit should be positive");
+      Validate.isTrue(sql.getRowLimit() > 0, "rowLimit should be positive");
     }
   }
 
   public static void validateInsertTabletRequest(InsertTabletRequest insertTabletRequest) {
     Objects.requireNonNull(insertTabletRequest.getTimestamps(), "timestamps should not be null");
-    Objects.requireNonNull(insertTabletRequest.getIsAligned(), "is_aligned should not be null");
-    Objects.requireNonNull(insertTabletRequest.getDevice(), "device should not be null");
-    Objects.requireNonNull(insertTabletRequest.getDataTypes(), "data_types should not be null");
+    Objects.requireNonNull(insertTabletRequest.getIsAligned(), "isAligned should not be null");
+    Objects.requireNonNull(insertTabletRequest.getDeviceId(), "deviceId should not be null");
+    Objects.requireNonNull(insertTabletRequest.getDataTypes(), "dataTypes should not be null");
     Objects.requireNonNull(insertTabletRequest.getValues(), "values should not be null");
   }
 
   public static void validateExpressionRequest(ExpressionRequest expressionRequest) {
     Objects.requireNonNull(expressionRequest.getExpression(), "expression should not be null");
-    Objects.requireNonNull(expressionRequest.getPrefixPath(), "prefix_path should not be null");
-    Objects.requireNonNull(expressionRequest.getStartTime(), "start_time should not be null");
-    Objects.requireNonNull(expressionRequest.getEndTime(), "end_time should not be null");
+    Objects.requireNonNull(expressionRequest.getPrefixPath(), "prefixPath should not be null");
+    Objects.requireNonNull(expressionRequest.getStartTime(), "startTime should not be null");
+    Objects.requireNonNull(expressionRequest.getEndTime(), "endTime should not be null");
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/StatementConstructionHandler.java
similarity index 97%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/StatementConstructionHandler.java
index 29bd53e9a1..c0d422601d 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/StatementConstructionHandler.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v1.handler;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.WriteProcessRejectException;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
-import org.apache.iotdb.db.protocol.rest.model.InsertTabletRequest;
+import org.apache.iotdb.db.protocol.rest.v1.model.InsertTabletRequest;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 import org.apache.iotdb.tsfile.utils.BitMap;
@@ -38,7 +38,7 @@ public class StatementConstructionHandler {
       throws IllegalPathException, WriteProcessRejectException {
     // construct insert statement
     InsertTabletStatement insertStatement = new InsertTabletStatement();
-    insertStatement.setDevicePath(new PartialPath(insertTabletRequest.getDevice()));
+    insertStatement.setDevicePath(new PartialPath(insertTabletRequest.getDeviceId()));
     insertStatement.setMeasurements(insertTabletRequest.getMeasurements().toArray(new String[0]));
     List<List<Object>> rawData = insertTabletRequest.getValues();
     List<String> rawDataType = insertTabletRequest.getDataTypes();
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/GrafanaApiServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
similarity index 92%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/GrafanaApiServiceImpl.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
index 96a85f9741..4301457b28 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/GrafanaApiServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.impl;
+package org.apache.iotdb.db.protocol.rest.v1.impl;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -31,15 +31,14 @@ import org.apache.iotdb.db.mpp.plan.parser.StatementGenerator;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
-import org.apache.iotdb.db.protocol.rest.GrafanaApiService;
-import org.apache.iotdb.db.protocol.rest.NotFoundException;
 import org.apache.iotdb.db.protocol.rest.handler.AuthorizationHandler;
-import org.apache.iotdb.db.protocol.rest.handler.ExceptionHandler;
-import org.apache.iotdb.db.protocol.rest.handler.QueryDataSetHandler;
-import org.apache.iotdb.db.protocol.rest.handler.RequestValidationHandler;
-import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
-import org.apache.iotdb.db.protocol.rest.model.ExpressionRequest;
-import org.apache.iotdb.db.protocol.rest.model.SQL;
+import org.apache.iotdb.db.protocol.rest.v1.GrafanaApiService;
+import org.apache.iotdb.db.protocol.rest.v1.handler.ExceptionHandler;
+import org.apache.iotdb.db.protocol.rest.v1.handler.QueryDataSetHandler;
+import org.apache.iotdb.db.protocol.rest.v1.handler.RequestValidationHandler;
+import org.apache.iotdb.db.protocol.rest.v1.model.ExecutionStatus;
+import org.apache.iotdb.db.protocol.rest.v1.model.ExpressionRequest;
+import org.apache.iotdb.db.protocol.rest.v1.model.SQL;
 import org.apache.iotdb.db.query.control.SessionManager;
 import org.apache.iotdb.db.utils.SetThreadName;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -136,8 +135,7 @@ public class GrafanaApiServiceImpl extends GrafanaApiService {
   }
 
   @Override
-  public Response expression(ExpressionRequest expressionRequest, SecurityContext securityContext)
-      throws NotFoundException {
+  public Response expression(ExpressionRequest expressionRequest, SecurityContext securityContext) {
     try {
       RequestValidationHandler.validateExpressionRequest(expressionRequest);
 
@@ -203,7 +201,7 @@ public class GrafanaApiServiceImpl extends GrafanaApiService {
   }
 
   @Override
-  public Response login(SecurityContext securityContext) throws NotFoundException {
+  public Response login(SecurityContext securityContext) {
     return Response.ok()
         .entity(
             new ExecutionStatus()
@@ -213,8 +211,7 @@ public class GrafanaApiServiceImpl extends GrafanaApiService {
   }
 
   @Override
-  public Response node(List<String> requestBody, SecurityContext securityContext)
-      throws NotFoundException {
+  public Response node(List<String> requestBody, SecurityContext securityContext) {
     try {
       if (requestBody != null && !requestBody.isEmpty()) {
         PartialPath path = new PartialPath(Joiner.on(".").join(requestBody));
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
similarity index 92%
copy from server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
copy to server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
index 2f00f2e5dd..e5ec2a298b 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.impl;
+package org.apache.iotdb.db.protocol.rest.v1.impl;
 
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -30,16 +30,16 @@ import org.apache.iotdb.db.mpp.plan.execution.IQueryExecution;
 import org.apache.iotdb.db.mpp.plan.parser.StatementGenerator;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
-import org.apache.iotdb.db.protocol.rest.RestApiService;
 import org.apache.iotdb.db.protocol.rest.handler.AuthorizationHandler;
-import org.apache.iotdb.db.protocol.rest.handler.ExceptionHandler;
-import org.apache.iotdb.db.protocol.rest.handler.ExecuteStatementHandler;
-import org.apache.iotdb.db.protocol.rest.handler.QueryDataSetHandler;
-import org.apache.iotdb.db.protocol.rest.handler.RequestValidationHandler;
-import org.apache.iotdb.db.protocol.rest.handler.StatementConstructionHandler;
-import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
-import org.apache.iotdb.db.protocol.rest.model.InsertTabletRequest;
-import org.apache.iotdb.db.protocol.rest.model.SQL;
+import org.apache.iotdb.db.protocol.rest.v1.RestApiService;
+import org.apache.iotdb.db.protocol.rest.v1.handler.ExceptionHandler;
+import org.apache.iotdb.db.protocol.rest.v1.handler.ExecuteStatementHandler;
+import org.apache.iotdb.db.protocol.rest.v1.handler.QueryDataSetHandler;
+import org.apache.iotdb.db.protocol.rest.v1.handler.RequestValidationHandler;
+import org.apache.iotdb.db.protocol.rest.v1.handler.StatementConstructionHandler;
+import org.apache.iotdb.db.protocol.rest.v1.model.ExecutionStatus;
+import org.apache.iotdb.db.protocol.rest.v1.model.InsertTabletRequest;
+import org.apache.iotdb.db.protocol.rest.v1.model.SQL;
 import org.apache.iotdb.db.query.control.SessionManager;
 import org.apache.iotdb.db.utils.SetThreadName;
 import org.apache.iotdb.rpc.TSStatusCode;
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/ExceptionHandler.java
similarity index 98%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/ExceptionHandler.java
index 5cc980fcc5..5db00b9c49 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/ExceptionHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v2.handler;
 
 import org.apache.iotdb.commons.auth.AuthException;
 import org.apache.iotdb.commons.exception.IllegalPathException;
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/ExecuteStatementHandler.java
similarity index 97%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/ExecuteStatementHandler.java
index d7f7841167..630d8999b8 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/ExecuteStatementHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v2.handler;
 
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.StatementType;
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java
similarity index 92%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java
index 14f54c7a37..9fd780259e 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v2.handler;
 
 import org.apache.iotdb.commons.exception.IoTDBException;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
@@ -72,8 +72,8 @@ public class QueryDataSetHandler {
   public static Response fillDataSetWithTimestamps(
       IQueryExecution queryExecution, final int actualRowSizeLimit, final long timePrecision)
       throws IoTDBException {
-    org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
-        new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
+    org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet =
+        new org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet();
 
     return fillQueryDataSetWithTimestamps(
         queryExecution, actualRowSizeLimit, targetDataSet, timePrecision);
@@ -82,8 +82,8 @@ public class QueryDataSetHandler {
   public static Response fillAggregationPlanDataSet(
       IQueryExecution queryExecution, final int actualRowSizeLimit) throws IoTDBException {
 
-    org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
-        new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
+    org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet =
+        new org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet();
 
     DatasetHeader datasetHeader = queryExecution.getDatasetHeader();
 
@@ -97,8 +97,8 @@ public class QueryDataSetHandler {
 
   private static Response fillShowPlanDataSet(
       IQueryExecution queryExecution, final int actualRowSizeLimit) throws IoTDBException {
-    org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
-        new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
+    org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet =
+        new org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet();
     initTargetDatasetOrderByOrderWithSourceDataSet(
         queryExecution.getDatasetHeader(), targetDataSet);
 
@@ -107,7 +107,7 @@ public class QueryDataSetHandler {
 
   private static void initTargetDatasetOrderByOrderWithSourceDataSet(
       DatasetHeader datasetHeader,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet) {
+      org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet) {
     if (datasetHeader.getRespColumns() != null) {
       for (int i = 0; i < datasetHeader.getRespColumns().size(); i++) {
         targetDataSet.addColumnNamesItem(datasetHeader.getRespColumns().get(i));
@@ -119,7 +119,7 @@ public class QueryDataSetHandler {
   private static void initTargetDatasetExpByOrderWithSourceDataSet(
       QueryDataSet sourceDataSet,
       int[] targetDataSetIndexToSourceDataSetIndex,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet) {
+      org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet) {
     if (sourceDataSet.getPaths() != null) {
       for (int i = 0; i < sourceDataSet.getPaths().size(); i++) {
         Path path = sourceDataSet.getPaths().get(i);
@@ -133,7 +133,7 @@ public class QueryDataSetHandler {
   private static Response fillQueryDataSetWithTimestamps(
       IQueryExecution queryExecution,
       int actualRowSizeLimit,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet,
+      org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet,
       final long timePrecision)
       throws IoTDBException {
     int fetched = 0;
@@ -151,7 +151,7 @@ public class QueryDataSetHandler {
       if (0 < actualRowSizeLimit && actualRowSizeLimit <= fetched) {
         return Response.ok()
             .entity(
-                new org.apache.iotdb.db.protocol.rest.model.ExecutionStatus()
+                new ExecutionStatus()
                     .code(TSStatusCode.QUERY_PROCESS_ERROR.getStatusCode())
                     .message(
                         String.format(
@@ -202,7 +202,7 @@ public class QueryDataSetHandler {
   private static Response fillQueryDataSetWithoutTimestamps(
       IQueryExecution queryExecution,
       int actualRowSizeLimit,
-      org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet)
+      org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet)
       throws IoTDBException {
     int fetched = 0;
     int columnNum = queryExecution.getOutputValueColumnCount();
@@ -210,7 +210,7 @@ public class QueryDataSetHandler {
       if (0 < actualRowSizeLimit && actualRowSizeLimit <= fetched) {
         return Response.ok()
             .entity(
-                new org.apache.iotdb.db.protocol.rest.model.ExecutionStatus()
+                new ExecutionStatus()
                     .code(TSStatusCode.QUERY_PROCESS_ERROR.getStatusCode())
                     .message(
                         String.format(
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/RequestValidationHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/RequestValidationHandler.java
similarity index 89%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/RequestValidationHandler.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/RequestValidationHandler.java
index 27b77596a5..2b7f568ede 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/RequestValidationHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/RequestValidationHandler.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v2.handler;
 
-import org.apache.iotdb.db.protocol.rest.model.ExpressionRequest;
-import org.apache.iotdb.db.protocol.rest.model.InsertTabletRequest;
-import org.apache.iotdb.db.protocol.rest.model.SQL;
+import org.apache.iotdb.db.protocol.rest.v2.model.ExpressionRequest;
+import org.apache.iotdb.db.protocol.rest.v2.model.InsertTabletRequest;
+import org.apache.iotdb.db.protocol.rest.v2.model.SQL;
 
 import org.apache.commons.lang3.Validate;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/StatementConstructionHandler.java
similarity index 98%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/StatementConstructionHandler.java
index 29bd53e9a1..4d643862d9 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/StatementConstructionHandler.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.handler;
+package org.apache.iotdb.db.protocol.rest.v2.handler;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.WriteProcessRejectException;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
-import org.apache.iotdb.db.protocol.rest.model.InsertTabletRequest;
+import org.apache.iotdb.db.protocol.rest.v2.model.InsertTabletRequest;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 import org.apache.iotdb.tsfile.utils.BitMap;
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/GrafanaApiServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
similarity index 92%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/GrafanaApiServiceImpl.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
index 96a85f9741..1512b56a6f 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/GrafanaApiServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.impl;
+package org.apache.iotdb.db.protocol.rest.v2.impl;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -31,15 +31,14 @@ import org.apache.iotdb.db.mpp.plan.parser.StatementGenerator;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
-import org.apache.iotdb.db.protocol.rest.GrafanaApiService;
-import org.apache.iotdb.db.protocol.rest.NotFoundException;
 import org.apache.iotdb.db.protocol.rest.handler.AuthorizationHandler;
-import org.apache.iotdb.db.protocol.rest.handler.ExceptionHandler;
-import org.apache.iotdb.db.protocol.rest.handler.QueryDataSetHandler;
-import org.apache.iotdb.db.protocol.rest.handler.RequestValidationHandler;
-import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
-import org.apache.iotdb.db.protocol.rest.model.ExpressionRequest;
-import org.apache.iotdb.db.protocol.rest.model.SQL;
+import org.apache.iotdb.db.protocol.rest.v2.GrafanaApiService;
+import org.apache.iotdb.db.protocol.rest.v2.handler.ExceptionHandler;
+import org.apache.iotdb.db.protocol.rest.v2.handler.QueryDataSetHandler;
+import org.apache.iotdb.db.protocol.rest.v2.handler.RequestValidationHandler;
+import org.apache.iotdb.db.protocol.rest.v2.model.ExecutionStatus;
+import org.apache.iotdb.db.protocol.rest.v2.model.ExpressionRequest;
+import org.apache.iotdb.db.protocol.rest.v2.model.SQL;
 import org.apache.iotdb.db.query.control.SessionManager;
 import org.apache.iotdb.db.utils.SetThreadName;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -136,8 +135,7 @@ public class GrafanaApiServiceImpl extends GrafanaApiService {
   }
 
   @Override
-  public Response expression(ExpressionRequest expressionRequest, SecurityContext securityContext)
-      throws NotFoundException {
+  public Response expression(ExpressionRequest expressionRequest, SecurityContext securityContext) {
     try {
       RequestValidationHandler.validateExpressionRequest(expressionRequest);
 
@@ -203,7 +201,7 @@ public class GrafanaApiServiceImpl extends GrafanaApiService {
   }
 
   @Override
-  public Response login(SecurityContext securityContext) throws NotFoundException {
+  public Response login(SecurityContext securityContext) {
     return Response.ok()
         .entity(
             new ExecutionStatus()
@@ -213,8 +211,7 @@ public class GrafanaApiServiceImpl extends GrafanaApiService {
   }
 
   @Override
-  public Response node(List<String> requestBody, SecurityContext securityContext)
-      throws NotFoundException {
+  public Response node(List<String> requestBody, SecurityContext securityContext) {
     try {
       if (requestBody != null && !requestBody.isEmpty()) {
         PartialPath path = new PartialPath(Joiner.on(".").join(requestBody));
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
similarity index 92%
rename from server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
rename to server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
index 2f00f2e5dd..d481090c87 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.iotdb.db.protocol.rest.impl;
+package org.apache.iotdb.db.protocol.rest.v2.impl;
 
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -30,16 +30,16 @@ import org.apache.iotdb.db.mpp.plan.execution.IQueryExecution;
 import org.apache.iotdb.db.mpp.plan.parser.StatementGenerator;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
-import org.apache.iotdb.db.protocol.rest.RestApiService;
 import org.apache.iotdb.db.protocol.rest.handler.AuthorizationHandler;
-import org.apache.iotdb.db.protocol.rest.handler.ExceptionHandler;
-import org.apache.iotdb.db.protocol.rest.handler.ExecuteStatementHandler;
-import org.apache.iotdb.db.protocol.rest.handler.QueryDataSetHandler;
-import org.apache.iotdb.db.protocol.rest.handler.RequestValidationHandler;
-import org.apache.iotdb.db.protocol.rest.handler.StatementConstructionHandler;
-import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
-import org.apache.iotdb.db.protocol.rest.model.InsertTabletRequest;
-import org.apache.iotdb.db.protocol.rest.model.SQL;
+import org.apache.iotdb.db.protocol.rest.v2.RestApiService;
+import org.apache.iotdb.db.protocol.rest.v2.handler.ExceptionHandler;
+import org.apache.iotdb.db.protocol.rest.v2.handler.ExecuteStatementHandler;
+import org.apache.iotdb.db.protocol.rest.v2.handler.QueryDataSetHandler;
+import org.apache.iotdb.db.protocol.rest.v2.handler.RequestValidationHandler;
+import org.apache.iotdb.db.protocol.rest.v2.handler.StatementConstructionHandler;
+import org.apache.iotdb.db.protocol.rest.v2.model.ExecutionStatus;
+import org.apache.iotdb.db.protocol.rest.v2.model.InsertTabletRequest;
+import org.apache.iotdb.db.protocol.rest.v2.model.SQL;
 import org.apache.iotdb.db.query.control.SessionManager;
 import org.apache.iotdb.db.utils.SetThreadName;
 import org.apache.iotdb.rpc.TSStatusCode;
diff --git a/site/src/main/.vuepress/config.js b/site/src/main/.vuepress/config.js
index 4698c42a14..ec2fdeaa65 100644
--- a/site/src/main/.vuepress/config.js
+++ b/site/src/main/.vuepress/config.js
@@ -627,7 +627,8 @@ const config = {
                 ['API/Programming-Go-Native-API', 'Go Native API'],
                 ['API/Programming-JDBC', 'JDBC (Not Recommend)'],
                 ['API/Programming-MQTT', 'MQTT'],
-                ['API/RestService', 'REST API'],
+                ['API/RestServiceV1', 'REST API V1 (Not Recommend)'],
+                ['API/RestServiceV2', 'REST API V2'],
                 ['API/Programming-TsFile-API', 'TsFile API'],
                 ['API/InfluxDB-Protocol', 'InfluxDB Protocol'],
                 ['API/Interface-Comparison', 'Interface Comparison'],
@@ -927,7 +928,8 @@ const config = {
                 ['API/Programming-Go-Native-API', 'Go 原生接口'],
                 ['API/Programming-JDBC', 'JDBC (不推荐)'],
                 ['API/Programming-MQTT', 'MQTT'],
-                ['API/RestService', 'REST API'],
+                ['API/RestServiceV1', 'REST API V1 (不推荐)'],
+                ['API/RestServiceV2', 'REST API V2'],
                 ['API/Programming-TsFile-API', 'TsFile API'],
                 ['API/Status-Codes', '状态码'],
               ],