注:0.5.0版本
This page lists the major RESTful APIs provided by Apache Griffin.
Apache Griffin default BASE_PATH is http://<your ip>:8080.
HTTP Response Design
We follow general rules to design Apache Griffin's REST APIs. In the HTTP response that is sent to a client,
the status code, which is a three-digit number, is accompanied by a reason phrase (also known as status text) that simply describes the meaning of the code.
The status codes are classified by number range, with each class of codes having the same basic meaning.
- The range 100-199 is classed as Informational.
- 200-299 is Successful.
- 300-399 is Redirection.
- 400-499 is Client error.
- 500-599 is Server error.
Valid Apache Griffin Response
The valid HTTP response is designed as follows:
| Action | HTTP Status | Response Body |
|---|---|---|
| POST | 201, "Created" | created item |
| GET | 200, "OK" | requested items |
| PUT | 204, "No Content" | no content |
| DELETE | 204, "No Content" | no content |
Note that: The metric module is implemented with elasticsearch bulk api, so the responses do not follow rules above.
Invalid Apache Griffin Response
The response for exception is designed as follows:
| Action | HTTP Status | Response Body |
|---|---|---|
| ANY | 400, "Bad Request" | error detail |
| ANY | 500, "Internal Server Error" | error detail |
{
"timestamp": 1517208444322,
"status": 400,
"error": "Bad Request",
"code": 40009,
"message": "Property 'measure.id' is invalid",
"path": "/api/v1/jobs"
}
{
"timestamp": 1517209428969,
"status": 500,
"error": "Internal Server Error",
"message": "Failed to add metric values",
"exception": "java.net.ConnectException",
"path": "/api/v1/metrics/values"
}
Description:
- timestamp: the timestamp of response created
- status : the HTTP status code
- error : reason phrase of the HTTP status
- code: customized error code
- message : customized error message
- exception: fully qualified name of cause exception
- path: the requested api
Note that: 'exception' field may not exist if it is caused by client error, and 'code' field may not exist for server error.
Apache Griffin Basic
Get Apache Griffin version
GET /api/v1/version
API Example
curl -k -H "Accept: application/json" -X GET http://127.0.0.1:8080/api/v1/version
0.3.0
Griffin Measures
Add measure
POST /api/v1/measures
Request Header
| key | value |
|---|---|
| Content-Type | application/json |
API Example
There are two kinds of measures, Apache Griffin measure and external measure.
The measure's 'dq.type' can either be 'ACCURACY' or 'PROFILING'.
Here is an example to define measure of profiling:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/measures \
-d '{
"name":"profiling_measure",
"measure.type":"griffin",
"dq.type":"PROFILING",
"rule.description":{
"details":[
{
"name":"age",
"infos":"Total Count,Average"
}
]
},
"process.type":"BATCH",
"owner":"test",
"description":"measure description",
"data.sources":[
{
"name":"source",
"connectors":[
{
"name":"connector_name",
"type":"HIVE",
"version":"1.2",
"data.unit":"1hour",
"data.time.zone":"UTC(WET,GMT)",
"config":{
"database":"default",
"table.name":"demo_src",
"where":"dt=#YYYYMMdd# AND hour=#HH#"
},
"predicates":[
{
"type":"file.exist",
"config":{
"root.path":"hdfs:///griffin/demo_src",
"path":"/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
]
}
]
}
],
"evaluate.rule":{
"rules":[
{
"dsl.type":"griffin-dsl",
"dq.type":"PROFILING",
"rule":"count(source.`age`) AS `age-count`,avg(source.`age`) AS `age-average`",
"name":"profiling",
"details":{}
}
]
}
}'
Here is an example to define measure of accuracy:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/measures \
-d '{
"name":"accuracy_measure",
"measure.type":"griffin",
"dq.type":"ACCURACY",
"process.type":"BATCH",
"owner":"test",
"description":"measure description",
"data.sources":[
{
"name":"source",
"connectors":[
{
"name":"connector_name_source",
"type":"HIVE",
"version":"1.2",
"data.unit":"1hour",
"data.time.zone":"UTC(WET,GMT)",
"config":{
"database":"default",
"table.name":"demo_src",
"where":"dt=#YYYYMMdd# AND hour=#HH#"
},
"predicates":[
{
"type":"file.exist",
"config":{
"root.path":"hdfs:///griffin/demo_src",
"path":"/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
]
}
]
},
{
"name":"target",
"connectors":[
{
"name":"connector_name_target",
"type":"HIVE",
"version":"1.2",
"data.unit":"1hour",
"data.time.zone":"UTC(WET,GMT)",
"config":{
"database":"default",
"table.name":"demo_tgt",
"where":"dt=#YYYYMMdd# AND hour=#HH#"
},
"predicates":[
{
"type":"file.exist",
"config":{
"root.path":"hdfs:///griffin/demo_src",
"path":"/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
]
}
]
}
],
"evaluate.rule":{
"rules":[
{
"dsl.type":"griffin-dsl",
"dq.type":"ACCURACY",
"name":"accuracy",
"rule":"source.desc=target.desc"
}
]
}
}'
Here is an example to define external measure:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/measures \
-d '{
"name": "external_name",
"measure.type": "external",
"dq.type": "ACCURACY",
"description": "measure description",
"organization": "orgName",
"owner": "test",
"metric.name": "metricName"
}'
Get measure
GET /api/v1/measuresGET /api/v1/measures/{measure_id}
API Example
curl -k -H "Accept: application/json" -X GET http://127.0.0.1:8080/api/v1/measures
[{
"measure.type": "griffin",
"id": 1,
"name": "accuracy_measure",
"owner": "test",
"description": "measure description",
"deleted": false,
"dq.type": "ACCURACY",
"sinks": ["ELASTICSEARCH", "HDFS"],
"process.type": "BATCH",
"data.sources": [{
"id": 4,
"name": "source",
"connectors": [{
"id": 5,
"name": "connector_name_source",
"type": "HIVE",
"version": "1.2",
"predicates": [{
"id": 6,
"type": "file.exist",
"config": {
"root.path": "hdfs:///127.0.0.1/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
],
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_src",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
}
}
],
"baseline": false
}, {
"id": 7,
"name": "target",
"connectors": [{
"id": 8,
"name": "connector_name_target",
"type": "HIVE",
"version": "1.2",
"predicates": [{
"id": 9,
"type": "file.exist",
"config": {
"root.path": "hdfs:///127.0.0.1/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
],
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_tgt",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
}
}
],
"baseline": false
}
],
"evaluate.rule": {
"id": 2,
"rules": [{
"id": 3,
"rule": "source.desc=target.desc",
"dsl.type": "griffin-dsl",
"dq.type": "ACCURACY"
}
]
},
"measure.type": "griffin"
}
]
Remove measure
DELETE /api/v1/measures/{measure_id}
When deleting a measure,api will also delete related jobs.
API example
curl -k -H "Accept: application/json" -X DELETE http://127.0.0.1:8080/api/v1/measures/1
The response body should be empty if no error happens, and the HTTP status is (204, "No Content").
Update measure
PUT /api/v1/measures
API example
Here is an example to update measure:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X PUT http://127.0.0.1:8080/api/v1/measures \
-d '{
"measure.type": "griffin",
"id": 19,
"name": "profiling_measure_edited",
"owner": "test",
"description": "measure description",
"deleted": false,
"dq.type": "PROFILING",
"sinks": ["ELASTICSEARCH", "HDFS"],
"process.type": "BATCH",
"rule.description": {
"details": [{
"name": "age",
"infos": "Total Count,Average"
}
]
},
"data.sources": [{
"id": 22,
"name": "source",
"connectors": [{
"id": 23,
"name": "connector_name",
"type": "HIVE",
"version": "1.2",
"predicates": [{
"id": 24,
"type": "file.exist",
"config": {
"root.path": "hdfs:///griffin/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
],
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_src",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
}
}
],
"baseline": false
}
],
"evaluate.rule": {
"id": 20,
"rules": [{
"id": 21,
"rule": "count(source.`age`) AS `age-count`,avg(source.`age`) AS `age-average`",
"dsl.type": "griffin-dsl",
"dq.type": "PROFILING",
"details": {}
}
]
},
"measure.type": "griffin"
}'
Here is an example to update external measure:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X PUT http://127.0.0.1:8080/api/v1/measures \
-d '{
"measure.type": "external",
"id": 25,
"name": "external_name",
"owner": "test",
"description": "measure description edited",
"organization": "orgName",
"deleted": false,
"dq.type": "ACCURACY",
"sinks": ["ELASTICSEARCH", "HDFS"],
"metric.name": "metricName",
"measure.type": "external"
}'
Griffin Jobs
Add job
POST /api/v1/jobs
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/jobs \
-d '{
"measure.id": 10,
"job.name":"job_name_10",
"job.type":"batch",
"cron.expression": "0 0/4 * * * ?",
"cron.time.zone": "GMT+8:00",
"predicate.config": {
"checkdonefile.schedule":{
"interval": "1m",
"repeat": 2
}
},
"data.segments": [
{
"data.connector.name": "connector_name_source",
"as.baseline":true,
"segment.range": {
"begin": "-1h",
"length": "1h"
}
},
{
"data.connector.name": "connector_name_target",
"segment.range": {
"begin": "-1h",
"length": "1h"
}
}
]
}'
Trigger job by id
POST /api/v1/jobs/trigger/{job_id}
API Example
curl -k -X POST http://127.0.0.1:8080/api/v1/jobs/trigger/51
Get all jobs
GET /api/v1/jobs
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/jobs
[{
"job.type": "batch",
"id": 51,
"measure.id": 10,
"job.name": "job_name_10",
"metric.name": "job_name_10",
"quartz.name": "job_name_10_1547192473206",
"quartz.group": "BA",
"cron.expression": "0 0/4 * * * ?",
"job.state": {
"state": "NORMAL",
"toStart": false,
"toStop": true,
"nextFireTime": 1547693040000,
"previousFireTime": 1547692800000
},
"cron.time.zone": "GMT+8:00",
"predicate.config": {
"checkdonefile.schedule": {
"interval": "1m",
"repeat": 2
}
},
"data.segments": [{
"id": 52,
"data.connector.name": "connector_name_source",
"as.baseline": true,
"segment.range": {
"id": 53,
"begin": "-1h",
"length": "1h"
}
}, {
"id": 54,
"data.connector.name": "connector_name_target",
"as.baseline": false,
"segment.range": {
"id": 55,
"begin": "-1h",
"length": "1h"
}
}
],
"job.type": "batch"
}
]
Get a job by id
GET /api/v1/jobs/config?jobId={job_id}
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/jobs/config?jobId=827
{
"job.type": "batch",
"id": 827,
"measure.id": 10,
"job.name": "job_name_10",
"metric.name": "job_name_10",
"quartz.name": "job_name_10_1547694147531",
"quartz.group": "BA",
"cron.expression": "0 0/4 * * * ?",
"cron.time.zone": "GMT+8:00",
"predicate.config": {
"checkdonefile.schedule": {
"interval": "1m",
"repeat": 2
}
},
"data.segments": [{
"id": 828,
"data.connector.name": "connector_name_source",
"as.baseline": true,
"segment.range": {
"id": 829,
"begin": "-1h",
"length": "1h"
}
}, {
"id": 830,
"data.connector.name": "connector_name_target",
"as.baseline": false,
"segment.range": {
"id": 831,
"begin": "-1h",
"length": "1h"
}
}
],
"job.type": "batch"
}
Delete job by id
DELETE /api/v1/jobs/{job_id}
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X DELETE http://127.0.0.1:8080/api/v1/jobs/51
Delete job by name
DELETE /api/v1/jobs?jobName={name}
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X DELETE http://127.0.0.1:8080/api/v1/jobs?jobName=job_name_10
The response body should be empty if no error happens, and the HTTP status is (204, "No Content").
Get job instances
GET /api/v1/jobs/instances?jobId={id}&page={pageNum}&size={pageSize}
Request Parameter
| name | description | type | example value |
|---|---|---|---|
| jobId | job id | Long | 1 |
| page | page you want starting from index 0 | int | 0 |
| size | instance number per page | int | 10 |
API Example
curl -k -G -X GET http://127.0.0.1:8080/api/v1/jobs/instances -d jobId=827 -d page=1 -d size=5
[{
"id": 1176,
"sessionId": null,
"state": "NOT_FOUND",
"type": "BATCH",
"predicateGroup": "PG",
"predicateName": "job_name_10_predicate_1547776800012",
"timestamp": 1547776800012,
"expireTimestamp": 1548381600012
}, {
"id": 1175,
"sessionId": null,
"state": "NOT_FOUND",
"type": "BATCH",
"predicateGroup": "PG",
"predicateName": "job_name_10_predicate_1547776560018",
"timestamp": 1547776560019,
"expireTimestamp": 1548381360019
}
]
Get job healthy statistics
GET /api/v1/jobs/health
API Example
curl -k -X GET http://127.0.0.1:8080/api/v1/jobs/health
{
"healthyJobCount": 0,
"jobCount": 1
}
Download sample records
GET /api/v1/jobs/download?jobName={name}&ts={timestamp}
Request Parameter
| name | description | type | example value |
|---|---|---|---|
| jobName | job name | String | 1 |
| timestamp | timestamp | Long | 0 |
API Example
curl -k -G -X GET http://127.0.0.1:8080/api/v1/jobs/download \
-d jobName=job_name_10 -d timestamp=1547778857807
If successful, this method returns missing records in the response body, maximum record count is 100.
Metrics
Get metrics
GET /api/v1/metrics
API Example
The response is a map of metrics group by measure name. For example:
curl -k -X GET http://127.0.0.1:8080/api/v1/metrics
{
"measure_no_predicate_day": [
{
"name": "job_no_predicate_day",
"type": "accuracy",
"owner": "test",
"metricValues": [
{
"name": "job_no_predicate_day",
"tmst": 1517994480000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
},
{
"name": "job_no_predicate_day",
"tmst": 1517994240000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
}
]
}
],
"measure_predicate_hour": [
{
"name": "job_predicate_hour",
"type": "accuracy",
"owner": "test",
"metricValues": []
}
]
}
Add metric values
POST /api/v1/metrics/values
Request Body
| name | description | type |
|---|---|---|
| Metric Values | A list of metric values | MetricValue |
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/metrics/values \
-d '[
{
"name" : "metricName",
"tmst" : 1509599811123,
"value" : {
"__tmst" : 1509599811123,
"miss" : 11,
"total" : 125000,
"matched" : 124989
}
}
]'
The response body should have 'errors' field as 'false' if success, for example
{
"took": 32,
"errors": false,
"items": [
{
"index": {
"_index": "griffin",
"_type": "accuracy",
"_id": "AWFAs5pOJwYEbKWP7mhq",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true,
"status": 201
}
}
]
}
Get metric values by name
GET /api/v1/metrics/values?metricName={name}&size={size}&offset={offset}&tmst={timestamp}
Request Parameter
| name | description | type | example value |
|---|---|---|---|
| metricName | name of the metric values | String | job_no_predicate_day |
| size | max amount of return records | int | 5 |
| offset | the amount of records to skip by timestamp in descending order | int | 0 |
| tmst | the start timestamp of records you want to get | long | 0 |
Parameter offset and tmst are optional.
API Example
curl -k -G -X GET http://127.0.0.1:8080/api/v1/metrics/values -d metricName=job_no_predicate_day -d size=10
[
{
"name": "job_no_predicate_day",
"tmst": 1517994720000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
},
{
"name": "job_no_predicate_day",
"tmst": 1517994480000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
},
{
"name": "job_no_predicate_day",
"tmst": 1517994240000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
}
]
Delete metric values by name
DELETE /api/v1/metrics/values?metricName={name}
API Example
The response body should have 'failures' field as empty if success, for example
curl -k -H "Accept: application/json" \
-X DELETE http://127.0.0.1:8080/api/v1/metrics/values?metricName=job_no_predicate_day
{
"took": 363,
"timed_out": false,
"total": 5,
"deleted": 5,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
Hive MetaStore
Get table metadata
GET /api/v1/metadata/hive/table?db={}&table={}
Request Parameters
| name | description | type | example value |
|---|---|---|---|
| db | hive database name | String | default |
| table | hive table name | String | demo_src |
API Example
curl -k -H "Accept: application/json" \
-G -X GET http://127.0.0.1:8080/api/v1/metadata/hive/table \
-d db=default \
-d table=demo_src
{
"tableName": "demo_src",
"dbName": "default",
"owner": "root",
"createTime": 1505986176,
"lastAccessTime": 0,
"retention": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "age",
"type": "int",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "desc",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_src"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "hour",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
]
}
Get table names
GET /api/v1/metadata/hive/tables/names?db={}
Request Parameter
| name | description | typ | example value |
|---|---|---|---|
| db | hive database name | String | default |
API Example
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/table?db=default
[
"demo_src",
"demo_tgt"
]
Get all database tables metadata
GET /api/v1/metadata/hive/dbs/tables
API Example
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/dbs/tables
{
"default": [
{
"tableName": "demo_src",
"dbName": "default",
"owner": "root",
"createTime": 1505986176,
"lastAccessTime": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "age",
"type": "int",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "desc",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_src"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "hour",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
]
},
{
"tableName": "demo_tgt",
"dbName": "default",
"owner": "root",
"createTime": 1505986176,
"lastAccessTime": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "age",
"type": "int",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "desc",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_tgt"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "hour",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
]
}
]
}
Get database names
GET /api/v1/metadata/hive/dbs
API Example
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/dbs
[
"default"
]
Get tables metadata
GET /api/v1/metadata/hive/tables?db={name}
Request Parameter
| name | description | typ | example value |
|---|---|---|---|
| db | hive database name | String | default |
API Example
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/tables?db=default
[
{
"tableName": "demo_src",
"dbName": "default",
"owner": "root",
"createTime": 1508216660,
"lastAccessTime": 0,
"retention": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "age",
"type": "int",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "desc",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_src"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "hour",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
]
},
{
"tableName": "demo_tgt",
"dbName": "default",
"owner": "root",
"createTime": 1508216660,
"lastAccessTime": 0,
"retention": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "age",
"type": "int",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "desc",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_tgt"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "hour",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
]
}
]
Auth
User authentication
POST /api/v1/login/authenticate
Request Parameter
| name | description | type | example value |
|---|---|---|---|
| map | a map contains user name and password | Map | {"username":"user","password":"test"} |
API Example
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/login/authenticate \
-d '{"username":"user","password":"test"}'
if authentication passes, response below will be returned.
{
"fullName": "Default",
"ntAccount": "user",
"status": 0
}