Skip to content

MVsharp REST interface

Details and examples of using MVsharp REST Interface to integrate into the MVsharp environment.

Introduction

The MVsharp REST Interface allows external applications to communicate with MVsharp using the REST Web Services protocol. It provides similar functionality to NetObjects but does not require a library to be loaded on the client application.

The following features are supported in the MVsharp REST Interface:

  • Read and write records from files in an account.
  • Execute TCL statements. If the statement results in a SELECT list being created, the list is also returned.
  • Call subroutines. Subroutines can be called with arguments, and the resulting arguments are returned.
  • Selecting files.
  • Get statistics of the connections to MVsharp.
  • Managing users, locks and processes.

The REST Interface is hosted in the MVsharp Service and does not require any Web Server to be installed on your systems.

The connection layer between the REST server and MVsharp uses NetObjects. A pool of connections is created by specifying the MaxPool and MinPool configuration parameters. The connection pool scales up when high request loads are encountered and will scale down to the MinPool value when request loads are lower.

Prerequisites

  1. MVsharp version 4.

Configuring REST Server

The REST server is installed with the current default parameters and must be configured before REST calls can be made.

Setting Description
MvSharpServer This is defaulted to 'localhost'. You can point the REST server to another instance of MVsharp.
MvSharpUser This is blank by default and needs to be configured with the TCL Command REST.CONFIG. You need to have administrator access to do this.
MvSharpPassword This is blank by default and needs to be configured with the TCL Command REST.CONFIG. You need to have administrator access to do this.
MinPool This is defaulted to 3 and is the number of connectors that are created at startup.
MaxPool This is defaulted to 10 and is the maximum number of connectors that can be used for REST calls. Connections are tied to a specific account so if there are a lot of accounts being accessed, increase as required.
RestPort This is defaulted to 9005 and is the port the end points will be listening on.

The TCL command REST.CONFIG can be used to configure these values. You must have Administrative Rights to successfully configure the REST server.

Calling MVsharp REST Interface

The examples below are based on the default configuration above. If you have used a different port, the REST calls need to be modified to reflect those changes.

Visual Studio Code has HTTP extensions that allow you to test REST calls from the IDE. We recommend installing this extension when testing the REST Interface.

rest_pic_1

List of Accounts on the server

To get a list of Accounts on the server we use the GET command:

http://localhost:9005/accounts

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 348
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Thu, 18 Nov 2018 10:49:13 GMT
Connection: close

[
  {
    "AccountName": "MVsharp",
    "AccountPath": "E:\\MVsharp Accounts\\MVsharp"
  },
  {
    "AccountName": "LICENSE",
    "AccountPath": "E:\\MVsharp Accounts\\LICENSE"
  },
  {
    "AccountName": "DEMO",
    "AccountPath": "E:\\MVsharp Accounts/DEMO"
  },
  {
    "AccountName": "MVSYNC",
    "AccountPath": "E:\\MVsharp Accounts/MVSYNC"
  },
  {
    "AccountName": "MVREST",
    "AccountPath": "E:\\MVsharp Accounts/MVREST"
  }
]

Reading and Writing Records

To read a record from a file in MVsharp we use the GET command:

http://localhost:9005/database/{Account}/{FileName}/{RecordId}

Database is the REST controller.

Account, FileName and RecordId are the parameters to be passed to the controller and are mandatory.

http://localhost:9005/database/MVsharp/VOC/DICTLIST

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 90
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Thu, 18 Nov 2018 14:48:25 GMT
Connection: close

{
"RecordId": "DICTLIST",
"Record": "PHþType Definition Conversion Head Format Depth By LOC"
}

The Record returned is in Multivalue format with Attribute, Value and Subvalue marks.

To write a record to a file in MVsharp we use the POST command:

HTTP request
POST http://localhost:9005/database/MVsharp/VOC/NewRecordId
Content-Type: application/json

{
  "RecordId": "NewRecordId",
  "Record": "Record Sent by MVsharp REST"
}

The RecordId and Record values are passed in the body of the HTTP POST command. The Record value contains a delimited string with Attribute marks, Value marks and Subvalue marks.

To delete a record from an MVsharp file we use the DELETE command:

DELETE http://localhost:9005/database/MVsharp/VOC/NewRecordId

Calling Subroutines

To call an MVsharp BASIC/JavaScript/Python/TypeScript subroutine we use the POST command:

http://localhost:9005/Subroutine/{Account}

Subroutine is the REST controller.

Account is the name of the account where the subroutine is compiled and catalogued.

In this example we have a simple BASIC subroutine that adds two numbers:

MV BASIC
SUBROUTINE ADD(Value1,Value2,Answer)
Answer = Value1 + Value2
Return
HTTP request
POST http://localhost:9005/Subroutine/MVsharp
Content-Type: application/json

{
  "SubroutineName":"ADD",
  "Arguments":["25","50",""]
}

Note

You must provide an argument for each of the subroutine's parameters.

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 16
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 07:26:58 GMT
Connection: close
[
  "25",
  "50",
  "75"
]

Executing TCL Commands

To execute a TCL command we use the POST command:

http://localhost:9005/execute/{Account}

Execute is the REST controller.

Account is the name of the account where the command will be executed.

HTTP request
POST http://localhost:9005/execute/MVsharp
Content-Type: application/json

{
  "TclStatement":"LIST VOC F1 F2 F3 SAMPLE 10"
}

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 933
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 07:32:25 GMT
Connection: close

{
  "ResponseText": [
    "LIST VOC F1 F2 F3 SAMPLE 10 09:32:26 11-19-21 Page 1 ",
    "VOC......... F1..........F2................F3............. ",
    "",
    "!CATS        Program     MVsharp.BP.Lib    !CATS.dll ",
    "!FIELDS      Program     MVsharp.BP.Lib    !FIELDS.dll ",
    "!FMTS        Program     MVsharp.BP.Lib    !FMTS.dll ",
    "!GTS         Program     MVsharp.BP.Lib    !GTS.dll ",
    "!ICONVS      Program     MVsharp.BP.Lib    !ICONVS.dll ",
    "!NES         Program     MVsharp.BP.Lib    !NES.dll ",
    "!OCONVS      Program     MVsharp.BP.Lib    !OCONVS.dll ",
    "!SPLICE      Program     MVsharp.BP.Lib    !SPLICE.dll ",
    "&COMO&       File        &COMO&            D_&COMO& ",
    "&DEVICES&    F           [MVsharp].[dbo]   [MVsharp].[dbo] ",
    "                         .[_&DEVICES&]     .[D__&DEVICES&] ",
    "",
    "10 records listed.",
    ""
  ],
    "ResponseList": [
    ""
  ]
}

If the command results in a select list being created, the list is returned in the object ResponseList.

Selecting Files

To select a file with criteria, we use the POST command:

POST http://localhost:9005/Select/{Account}/{FileName}

Select is the REST controller.

Account is the name of the account where the command will be executed and FileName is the file to be selected.

HTTP request
POST http://localhost:9005/Select/MVsharp/VOC
Content-Type: application/json

{
  "Criteria" : "WITH @ID LIKE LIST..."
}

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 190
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 07:35:19 GMT
Connection: close

[
  "LIST",
  "LIST.ACCOUNTS",
  "LIST.CACHE",
  "LIST.DIFF",
  "LIST.INDEX",
  "LIST.INTER",
  "LIST.ITEM",
  "LIST.LOCKS",
  "LIST.READU",
  "LIST.TRIGGER",
  "LIST.UNION",
  "LISTF",
  "LISTFILES",
  "LISTPTR",
  "LISTU",
  "LISTUSER"
]

Compiling Programs

To compile a BASIC program on the server we use the GET command:

http://localhost:9005/compile/{Account}/{FileName}/{ProgramName}[/{Options}]

Compile is the REST controller.

Account, FileName and ProgramName are the parameters to be passed to the controller and are mandatory.

Options is an optional parameter to pass to the BASIC command.

GET http://localhost:9005/compile/MVsharp/MVsharp.BP/ED/D

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 48
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 07:44:17 GMT
Connection: close

{
  "Result": "ED Compiled Successfully",
  "Errors": []
}

Cataloging Programs

To catalog a BASIC program on the server we use the GET command:

http://localhost:9005/catalog/{Account}/{FileName}/{ProgramName}

Catalog is the REST controller.

Account, FileName and ProgramName are the parameters to be passed to the controller and are mandatory.

GET http://localhost:9005/catalog/MVsharp/MVsharp.BP/ED

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 14
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 07:55:44 GMT
Connection: close

"ED Cataloged"

Get a List of Active Users

To get a list of active users we use the GET command:

http://localhost:9005/users

Users is the REST controller.

HTTP response
HTTP/1.1 200 OK
Content-Length: 477
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 10:18:25 GMT
Connection: close

[
  {
    "ProcessId": 32780,
    "UserId": "Grant Hart",
    "AccountName": "MVsharp",
    "Type": "shell",
    "LastCommand": "X",
    "LoginDate": "2018-11-19T12:17:20",
    "IpAddress": ""
  },
  {
    "ProcessId": 26924,
    "UserId": "Grant Hart",
    "AccountName": "MVsharp",
    "Type": "NetObj",
    "LastCommand": "LOGTO MVsharp",
    "LoginDate": "2018-11-19T12:18:14",
    "IpAddress": "127.0.0.1"
  },
  {
    "ProcessId": 37552,
    "UserId": "Grant Hart",
    "AccountName": "MVsharp",
    "Type": "telnet",
    "LastCommand": "X",
    "LoginDate": "2018-11-19T12:17:24",
    "IpAddress": "127.0.0.1"
  }
]

Send a Message to a User

To send a message to a user we use the POST command:

http://localhost:9005/users

Users is the REST controller.

HTTP request
POST http://localhost:9005/Users
Content-Type: application/json

{
  "ProcessId" : "12345",
  "ActionType" : "Message",
  "MessageText" : "This is a message"
}
HTTP response
HTTP/1.1 200 OK
Content-Length: 477
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 10:18:25 GMT
Connection: close

Logoff a User

To log off a specific user we use the POST command:

http://localhost:9005/users

Users is the REST controller.

HTTP request
POST http://localhost:9005/Users
Content-Type: application/json

{
  "ProcessId" : "12345",
  "ActionType" : "Logoff"
}

Returns:

HTTP response
HTTP/1.1 200 OK
Content-Length: 477
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 19 Nov 2018 10:18:25 GMT
Connection: close

Checking the status of the REST API Controllers

To check the status of the controllers we use the GET command:

http://localhost:9005/status

Status is the REST controller.

Returns:

HTTP response
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 09 Nov 2018 11:27:32 GMT
Content-Length: 345

[{
  "AccountName": "APA",
  "StartTime": "2018-11-09T13:27:22.6990641+02:00",
  "ProcessingRequest": false,
  "LastProcessed": "2018-11-09T13:27:22.6990641+02:00",
  "MessagesProcessed": 1
  }, {
  "AccountName": "MVsharp",
  "StartTime": "2018-11-09T13:15:07.0580597+02:00",
  "ProcessingRequest": false,
  "LastProcessed": "2018-11-09T13:23:37.477586+02:00",
  "MessagesProcessed": 5
}]

A list of each connection to MVsharp is returned.

Resetting the REST Controllers

If the REST server becomes unstable, you can reset all controllers with a GET command:

http://localhost:9005/status/reset

Status is the REST controller.

Returns:

HTTP response
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 09 Nov 2018 11:27:32 GMT
Content-Length: 345

[{
  "AccountName": "APA",
  "StartTime": "2018-11-09T13:27:22.6990641+02:00",
  "ProcessingRequest": false,
  "LastProcessed": "2018-11-09T13:27:22.6990641+02:00",
  "MessagesProcessed": 1
}, {
  "AccountName": "MVsharp",
  "StartTime": "2018-11-09T13:15:07.0580597+02:00",
  "ProcessingRequest": false,
  "LastProcessed": "2018-11-09T13:23:37.477586+02:00",
  "MessagesProcessed": 5
}]

A list of each connection to MVsharp is returned.