You could then iterate through the returned classes and check to see which ones are marked "system" by opening up each definition. I seem to vaguely remember a way to do this with a query but I can't find it now.

Programmatically you can use the SubclassOf() query in the %Dictionary.ClassDefinitionQuery class. Pass in %Persistent and the flag for non-system classes.

So if I am calling this service from an Ensemble operation that looks something like this:

Method getPatient(pRequest As RESTDemo.REST.ClaimRequest, Output pResponse As EnsLib.REST.GenericMessage) As %Status
{
  try {
    // Prepare and log the call
    // Append the claim to the URL
    Set tURL=..Adapter.URL_"/claims/"_pRequest.claimBlob    
       
    // Execute the call
    set tSC=..Adapter.GetURL(tURL,.tHttpResponse)
       
    #; Suppress HTTP status errors and just pass back the status, headers and body
    If $$$ISERR(tSC)&&'$$$StatusEquals(tSC,$$$EnsErrHTTPStatus) { Quit }
       
    // Return the response      
    Set tSC=$$$OK
    If $IsObject(tHttpResponse.Data) {
      Set tStream=tHttpResponse.Data
    } Else {
      Set tStream=##class(%GlobalBinaryStream).%New()
      Set tSC=tStream.Write(tHttpResponse.Data)  Quit:$$$ISERR(tSC)
    }
    Set pResponse=##class(EnsLib.REST.GenericMessage).%New(tStream,,tHttpResponse)
    Do pResponse.HTTPHeaders.SetAt(tHttpResponse.StatusLine,"StatusLine")
  } catch {
    Set tSC=$$$SystemError
  }
  Quit tSC
}

Would I just call $system.Encryption.Base64Encode() on the claimBlob property?

I found the synctimedout variable in the documentation after a more thorough search. I am able to use this in an if condition to send the alert.

I typically use the SQL shell in the terminal when doing this. It is very powerful.

SAMPLES>do $system.SQL.Shell()

SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.

SAMPLES>>?

Interactive SQL Shell
               (c) InterSystems Corporation 1999-2009 All Rights Reserved
----------------------------------------------------
To execute an SQL statement, type it in and press ENTER.
To execute a multiline SQL statement, press <enter> to enter
multiline statement mode, enter the each statement line and
enter GO to exit multiline statement mode and execute the statement.

etc...

This uses %SQL.Statement to do all the work and has a number of options including saving of queries, etc.

Looks like the server definition screen no longer allows me certain characters in the connection name. I used to name my server connections like this: "Ensemble 2016.2 736". This used to work fine. Now I get no "Finish" button unless I take out the white space and possibly the period. I ended up creating the following with no issues: "Ensemble2016p2b736"

If you are on Ensemble/ HealthShare you could use a REST passthrough service. Your would call the passthrough operation, (non ssl), which would then call your operation (with credentials), and you could see the request to the REST service. Anything passed back would also be returned into the passthrough service.

Did you ever bounce the service to make sure it was using the latest version you had compiled?

I have not been able use the %request.Data property with URL parameters in a GET.  Is this now available? The testing I did last week (Just using an external REST tool and passing parameters in different formats) didn't allow me to get any URL body parameters in the %request.Data property. They weren't defined.

Great post. Using the documents is almost like going back to the time where I would create my own global structures to handle the changing data needs. Very intuitive and flexible.