- Table of Contents
- What is MDriven
- Introduction
- Praise to UML
- What if UML was forbidden
- Luckily UML is NOT forbidden
- What is not to like
- What is next
- Information design
- Introduction to UML
- Association classes
- Inheritance
- Polymorphism
- Composite and Aggregate
- Derived attributes & associations
- UML – State machines
- Constraints
- The ViewModel
- The declarative ViewModel
- Taking it further still
- What an Action can do
- Global actions
- Action names
- Microsoft Office and OpenDocument
- Prototyping
- Introducing MDriven Server
- Security concerns
- MDrivenServer Summarized
- Periodic server-side actions
- Exporting files from MDriven Server
- SQLExport from MDriven Server
- What is Object Constraint Language
- Certain important constructs
- Seeker view
- Efficient ViewModel fetch
- Introducing MDriven Turnkey
- Creating your own MDriven Turnkey instance in your Azure account
- Set up MDriven Turnkey on premise
- Turnkey architecture
- Security
- Information Security
- Access control system in MDriven
- Simple table component
- Access control system in MDriven
- Accessing objects and navigating meta-levels in code
- Added tagged values to attributes
- Load balancing Turnkey and MDrivenServer
- CleanForFree
- CodeDress
- Corrupt MDriven Server
- Custom OR Mapping
- Doing your own Primary keys
- Downgrade MDriven Framework version
- Efficient ViewModel fetch
- Exporting files from MDriven Server
- Rename a class in your model
- IAsyncSupportService
- Import data from other SQL servers
- Importing web service interface as model
- Installing MDriven Server on Windows
- Logging OCL in Turnkey
- MDrivenServer, serverside environment variables
- Problem saving database script
- PSExpression
- Remote Turnkey access
- Reverse engineer a database
- Side effects
- SQLExport from MDriven Server
- Using other than standard Persistence Mappers per attribute
- Using the model debugger to change the model itself
- Versioned on class
- WCF issues
- HasUserCode in Enterprise Core Objects
REST Services are services executed by connecting to a URL that defines operation and parameters and returns an answer – not seldom as JSON objects.
You must set the tagged value RestAllowed on the ViewModels you want to allow Rest access to.
Contents
Calling Existing REST Services
MDriven supports a couple of EAL operators to manage REST services. All operators reside on the selfVM variable which is available only in the ViewModel context.
selfVM.RestGet(targeturl,user,pwd,optionalnestingwithheaders)
Read: OCLOperators RestGet
selfVM.RestPost(targeturl,user,pwd,optionalnestingwithheadersAndUploadValues)
Read: OCLOperators RestPost
selfVM.RestDownload(targeturl,user,pwd,optionalnestingwithheaders)
Read: OCLOperators RestDownload
Note! optionalnestingwithheaders is the name of the blue ViewModel class in the example below (as an OCL String).
Example
The action GetExporttest retrieves data by converting another ViewModel to XML - it stores it in the variable vText
.
The next action invokes RestPost to send that data to a URL address; it also says it should look at the nesting named 'Xml'. In this nesting, we have the STRINGCONTENT (see also OCLOperators RestPost) which gets its content from the vText variable. We also add the header Authorization with a bearer token to get access from the receiving service.
Exposing Ourselves as a REST Service
When it comes to exposing ourselves to others – Turnkey has two MVC verbs, Get and Post, like this:
TurnkeyRest/Get?command=vmname&id=rootobjref TurnkeyRest/Post?command=vmname&id=rootobjref New(2023-04): --- if you have a varible vRestVerb it is assigned the verb used TurnkeyRest/Put?command=vmname&id=rootobjref TurnkeyRest/Patch?command=vmname&id=rootobjref TurnkeyRest/Delete?command=vmname&id=rootobjref use Disable/ReadOnly expression on actions to decide what to run: vRestVerb<>'Put' -- readonly for all but Put
See Improved routes for other URLs.
The ViewModel name is supplied as the command parameter.
The id parameter is an object reference in one of several available formats. Read more here about how to create these.
Caution: Always send a complete ID, i.e. a guid or xx|yyyy. Using a shortcut without a class identifier can cause problems.
Note that the variables set in your ViewModel have to be of the String type.
The Commands Do This:
We check that the tagged value RestAllowed has been set on the ViewModel, then look up the root object.
When the ViewModel and its root have been found, we check the accessgroups to see if access is allowed.
Then additional parameters are set (these can be either URL Encoded or multi-part form-encoded. See HTTP POST for details).
- For Get, the parameter names are looked up against ViewModel variables, and variable values are set.
- For Post, the parameter names are looked up against ViewModel variables, and attributes and values are set.
Then any actions present at the root level of the ViewModel are executed - in the order presented in the ViewModel from top to bottom.
- For Get, use the actions to look up additional information.
- For Post, the actions are usually used to process sent JSON data into objects (see below)
Post saves any changed values to the database.
Both Get and Post return the ViewModel content as JSON in the HTTP response. To override this, use one of these strategies:
- Add a string attribute named exactly RawJSon on the root - if found, this is returned instead of the complete VM as JSON.
- Add a vReturnMessage:String variable as described further down this page
If there is an error, a string “error: <message>” is returned.
If you need to receive Post data unknown at design time, please read: Receive post data not known at design time.
You may use C# code to post to TurnkeyRest.
Processing JSON into Objects
If you want to send data as JSON in a POST, you need to apply the JSON string to your system's modeled objects.
Use Tajson or the simpler JsonToObjects. Read more here on XML or JSON support: Import xml and JSon with MDriven
The selfVM.JSonToObjects creates objects with the root of a class and matches attributes and associations from the JSON data – it can create object trees (unclosed graphs) by following names on associations.
selfVM.JSonToObjects( «<Type>» , JSonDataInStringFormat)
You can use an existing JSON as a template to create a model section you can import into - see: Using JSON or XML as a class template.
Video
To make your experience smooth, we set the main tags mentioned in the video to the right bar menu of this mini-player. Choose an interesting subtitle on the list and immediately get to the exact theme navigation item place in the video. Now you can pick any topic to be instructed on without watching the whole video.
Return Status Codes and Override Returned Data
New from 2020-12-09: You can now override return result data and code by declaring variables in your RestAllowed ViewModel:
vReturnMessage:String vReturnStatusCode:String
The vReturnMessage (reason code) must be found and will be returned as content instead of the default (to make JSON of the ViewModel). The return message will have the status code "vReturnStatusCode".
If the vReturnStatusCode is found, it must have one of the values defined here: https://docs.microsoft.com/en-us/dotnet/api/system.net.httpstatuscode?view=net-5.0 Otherwise, 200 "Ok" is returned. We will parse the string value with this logic:
realstatuscode = (System.Net.HttpStatusCode)System.Net.HttpStatusCode.Parse(typeof(System.Net.HttpStatusCode), (string)(returnstatuscode.AsObject), true); This means the action code can look like this: vReturnStatusCode:='NotFound' or vReturnStatusCode:='Created' etc
Read Status Code from RestPost, RestGet, etc
Use the vReturnStatusCode:string variable name to get Status from querying others with rest - RestPost, RestGet, etc.
Use the vReturnMessage:string variable name to get the reasoncode from others with Rest.
Receive String Content
We assume postback data as FormFields that we match to ViewModelColumns. If someone posts string content (no form data), we now put that data in a column named "STRINGCONTENT" if found.
Debugging
It may sometimes be time-consuming to get all the parameters correct when forming a request. A tip is to use postman-echo.com [1] to better understand what is sent.