#REST API

11 Followers · 635 Posts

Representational state transfer (REST) is a software architectural style that defines a set of constraints to be used for creating Web services. Web services that conform to the REST architectural style, called RESTful Web services (RWS), provide interoperability between computer systems on the Internet. RESTful Web services allow the requesting systems to access and manipulate textual representations of Web resources by using a uniform and predefined set of stateless operations. Other kinds of Web services, such as SOAP Web services, expose their own arbitrary sets of operations.

Learn More.

Question Eduard Lebedyuk · May 23, 2016

Problem: I have a REST broker, and if I hit a code block, which does IO redirection, the REST reply becomes broken in one of the following ways:

  • Binary output
  • No output
  • First 4096 characters of the reply are missing

Consider the following REST broker:

Class A.REST Extends %CSP.REST
{

XData UrlMap
{
<Routes>
<Route Url="/Test/:redirect" Method="GET" Call="Test"/>
 </Routes>
}

ClassMethod Test(Redirect As %Boolean = {$$$YES}) As %Status
{
    Set str = $TR($J("",4098)," ","1") // Get a string with the length of 4098 symbols
    
    Do:Redirect ..OutputToStr($Classname(), "UnrelatedAction")
    Write str
    Return $$$OK
}

ClassMethod UnrelatedAction()
{
    Set a=1
}

/// Executes actions and returns device output <br>
/// pObj - OREF or class<br>
/// pMethod - instance or class method to execute respectively<br>
/// pArgs - additional arguments
ClassMethod OutputToStr(pObj, pMethod, pArgs...) As %String [ ProcedureBlock = 0 ]
{
    try {
        set str=""

        //Redirect IO to the current routine - makes use of the labels defined below
        use $io::("^"_$ZNAME)

        //Enable redirection
        do ##class(%Device).ReDirectIO(1)

            if $isobject(pObj) {
                do $Method(pObj,pMethod,pArgs...)
            } elseif $$$comClassDefined(pObj) {
                do $ClassMethod(pObj,pMethod,pArgs...)
            }

        //Disable redirection
        do ##class(%Device).ReDirectIO(0)
    } catch ex {
        
        if ##class(%Device).ReDirectIO() {
            do ##class(%Device).ReDirectIO(0)
        }
        set str = ""
    }

    quit str

    //Labels that allow for IO redirection
    //Read Character - we don't care about reading
rchr(c)      quit
    //Read a string - we don't care about reading
rstr(sz,to)  quit
    //Write a character - call the output label
wchr(s)      do output($char(s))  quit
    //Write a form feed - call the output label
wff()        do output($char(12))  quit
    //Write a newline - call the output label
wnl()        do output($char(13,10))  quit
    //Write a string - call the output label
wstr(s)      do output(s)  quit
    //Write a tab - call the output label
wtab(s)      do output($char(9))  quit
    //Output label - this is where you would handle what you actually want to do.
    //  in our case, we want to write to str
output(s)    set str=str_s   quit
}

}
3
1 1411
Question Scott Roth · Nov 30, 2018

I am trying to explore some new possibilities outside of the normal day to day HL7 interfacing we do. I have only done 1 other Web Service interface but it was using a SOAP proxy wizard. Now I am tasked with trying to make a call to an external API 

https://npiregistry.cms.hhs.gov/api/

but I am a bit confused about how to go about doing it. Since they don't have a wsdl, this means it is a REST web service correct? or is it considered an API call?

12
2 1215
Question Kurro Lopez · Oct 30, 2019

Hello,

We need to create a versioning of an existing API, so we going to set a default version (so far) for current connections to version 1

My first attempt is:

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<RouteUrl="(?i)/check"Method="GET"Call="CheckApi"/>
<RouteUrl="(?i)/getcustomer"Method="POST"Call="GetCustomerDefault"/>
<RouteUrl="(?i)/revoke"Method="DELETE"Call="RevokeDefault"/>
<RouteUrl="(?i)/:version/getcustomer"Method="POST"Call="GetCustomer"/>
<RouteUrl="(?
5
0 572
Question Daniel Kutac · Mar 23, 2016

Hello, our customer, large industrial company, is considering modernizing their old CSP application so it can run on multiple client device types, using responsive design.

They have a lot of experience with CSP and some ZEN.

They are new to REST and have some limited knowledge of javascript - perhaps not enough to the extent used by client framework.

Does anyone have a framework or a set of templates that you would be willing to share?

Thank you!

Dan Kutac 

7
0 875
Question prashanth ponugoti · Dec 2, 2021

I am totally struck and last 3 days I am not able to progress much. Here I need to call POST method in REST endpoint in Business Operation.

Please find the code below, which is working fine in IRIS 2020.1 but not in cache 2017.

$$$LOGINFO("InvokeTokenAPI...")
try
{
Set httpRequest= ##class(%Net.HttpRequest).%New()
Set httpRequest.Server = ..Adapter.HTTPServer
Set httpRequest.Location = ..Adapter.URL
Set httpRequest.SSLConfiguration = ..Adapter.SSLConfig Set httpRequest.Https = $$$YES
Set httpRequest.ContentType = "application/x-www-form-urlencoded" do httpRequest.InsertFormData("grant_type",

8
1 331
Question George James · Oct 20, 2016

Evgeny

Thank you for your help yesterday at the Belfry.

When I try to subscribe to the RSS feeds using some news readers they do not accept them.

The W3C validator makes a lot of suggestions about what might be wrong, but my guess is that the feed title is blank.  Could this be fixed please?

W3C feed validator results for a group: http://validator.w3.org/feed/check.cgi?url=https%3A%2F%2Fcommunity.inte…

George

6
0 369
Question André-Claude Gendron · Jul 31, 2025

Hi everyone,

I’m working with an existing InterSystems IRIS server that hosts several web applications and namespace-specific code and data. I’d like to reverse-engineer the current environment into a %Installer.Manifest file so I can store it in Git and manage its changes.

My goal is to:

  • Track the application setup and configuration in version control
  • Rebuild environments consistently (namespaces, CSP apps, security roles, etc.)
  • Possibly automate deployments later on

I understand that %Installer is declarative and wasn’t necessarily designed to reflect a running system.

1
2 126
Question Chris Stewart · Mar 29, 2016

Hi

I have been experimenting with the creation of a set of REST services for an app.  The basic GET operation is set to create a %ZEN.proxyObject instance, and then set an instance of a Persistant class as a property, which gives me all of the values I want to return.  However, it also gives me some values that I don't want to return over REST (because they are both private, and large registered objects which will bog down performance)

How do I remove these values from the ZENproxyObject?

3
0 587
Question Pasi Leino · Apr 11, 2017

We are building a bunch of rest based services using Ens 2016.2 to serve our browser based application (Angular 4).

Two questions:

1. The initial authentication seems only work if credentials are placed in the url parameters.  Trying to use the Authorization header instead, the client code immediately complains about Access-Control-Allow-Origin. How can I resolve this?

2. After initial authentication, what is the proper way to send subsequent rest calls without having to include credential every time?

I have Parameter UseSession As Integer = 1 in my service class, but what else do I need to do?

7
0 2910
Question Joshua Goldman · Mar 16, 2016

This question came on the Ensemble in Healthcare email list. It's a great question. I'm working on an answer, but am posting it here to get any other input. I'll also address the option of using %CSP.REST.

Hello everyone,

 

Using Intersystems Healthshare/Ensemble, I am trying to make a RESTful Interface between Android/iOS app and Cache database. I have some queries and I am unable to find where exactly I can get any resources on them.

 

1. By extending the EnsLib.REST.

12
0 9867
Question Andrei Luiz Nenevê · Feb 22, 2017

Hi everyone, I have and Zen Mojo application, it's all working but I have some doubts about what is recommended to use: There is some reports of employees, for example, and actually I'm using some plugins : "Excelent export" to generate Excel reports and "jspdf" to generate PDF reports in client side.

I have an REST service, that receives the request, process and returns JSON, after client side receive the response it's processed.

- This can be slow/bad in applications with large data?

- It's better/recommended to use ZenReports even with ZenMojo applications?

2
0 448
Question Tani Frankel · Dec 8, 2016

Hi all (and specifically Eduard L. ;)

The Ensemble Workflow REST API provided here:

https://github.com/intersystems-ru/EnsembleWorkflow

(and mentioned before in this Community, also as the basis of the Angular UI, also available in the same Git) 

Has some very basic documentation as to how to work with the API (which also seems to be possibly a little out-dated as I think the /login URL is deprecated, for example).

Is there somewhere a more comprehensive documentation of this API?

3
0 716
Question Amir Samary · May 10, 2017

Hi everyone,

This is:

Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2016.2 (Build 736U) Fri Sep 30 2016 12:25:56 EDT

The server is on RedHat Linux while the browser is running on Windows (Firefox).

I am helping a partner build a complex modern HTML5 web application that talks with Caché using REST calls. They have been using %CSP.REST very successfully. Security works great as well. 

Some time ago, I had defined the parameter CONVERTINPUTSTREAM = 1 on their %CSP.REST classes and that seemed to work.

11
0 10385
Question Josh Barney · Mar 24, 2016

I believe the I have followed the instructions to attach a document to the body of a post request but nothing is being sent out in the files{} port of the request.  I can either get the stream in "data", not visible at all, or visible but no form data. Any help would be appreciated, below is what I have:

ClassMethod SendFax(phone As %Stringcoverpath As %Stringdocpath As %StringAs %String
{
     Set req ##class(%Net.HttpRequest).%New()
    //test server
    Set req.Server "httpbin.org"
    Set req.SSLConfiguration "CardChoice"
    
    Do req.InsertFormData("Username",##class(HData.

3
0 2572
Question Laura Blázquez García · Apr 20, 2018

Hello.

We have a request message with properties that has underscore. This is because we need to convert that request to JSON.

The problem is when we try to assign a value in a Business Process with the editor. It doesn't work, it doesn't compile.

How can we fix this?

This is the object used in the request: 

Class test.msg.struct.TestXML Extends (%SerialObject,%XML.Adaptor)
{
Property "status_id" As %String(MAXLEN = "");
Property service As %String(MAXLEN = "");
}

And this is the error:

Compilación iniciada en 04/20/2018 11:17:01 con calificadores 'k'
Compilando clase test.bp.
8
0 1032
Question Mike Yackanich · May 14, 2021

I have an interoperability production that functions as a FHIR proxy. I have a need to add an HTTP Header value to the outbound request. I've subclassed HS.FHIRServer.Interop.HTTPOperation, but I cannot find a way to add an HTTP Header to the request. The HTTP class used in HS.FHIRServer.Interop.HTTPOperation is HS.FHIRServer.RestClient.HTTP. That RestClient class does not seem to expose or allow modification of the actual HttpRequest.

I'm used to using %Net.HttpRequest and doing a request.SetHeader(key, value) - but that isn't available - or I can't find it - when using HS.FHIRServer.

3
0 545
Question Utsavi Gajjar · Apr 9, 2021

Hello,

I am trying to figure out if we can extend a business process in IRIS. My Use Case is that I am developing RESTful Interfaces and my each REST Interface needs to go through certain processes before getting to the actual action.  

e.g. I have 2 REST Interfaces, GetPatient and GetEncounter. Both of these need to invoke "GetToken" Business Operation to go to the Authentication server to get an authentication token before they go ahead and hit the Business Operation to Get the data i.e. Patient or Encounter.

1
1 321
Question Tom Philippi · Mar 18, 2017

I have a Enslib.REST.operation which I want to use to send a JSON message. In Ensemble I am using the request message to the Business operation as an input for ObjectToJsonStream function so I can send it out (this is the way to go right?). However, I am now running into the fact that one of the attributes (template_name) contains an underscore and that I am not allowed to use the underscore to define the property in my ensemble RequestMessage:

Property template_name As %String;

What's the best way to resolve this?

1
0 454
Question Mitch Scobell · Jul 23, 2018

I'm trying to have my REST service return the entire data set for one of our legacy globals.  Currently I am parsing the object from a SQL statement into generic objects to be returned like this:


         Set specimenArray=[]
        
        WHILE resultSet.%Next() {
            Set specimen = {}
            Set specimen.SpecimenId= resultSet.SpecimenId
            Set specimen.ProjectId = resultSet.ProjectId
            
            Set Oref = specimenArray.%Push(specimen)
        }
        
        Set tProxy = specimenArray.%ToJSON()
        set %response.Status = 200
        set %response.

2
0 903
Question Cristiano Silva · Jun 9, 2020

Hi guys,

I'm trying to consume a REST Service that use Digest authentication, I'm trying to implement the authentication but I'm don't know where is my mistake.

Someone have already used this type of authentication.

Below the code I wrote to try to generate the response hash:

 // Algorithm reference: https://en.wikipedia.org/wiki/Digest_access_authentication
 //
 // Test data:
 // Do TestDigest^HC.Debug("posstman", "password", "/digest-auth", "postman-echo.com", 80)
 // Do TestDigest^HC.Debug("usr", "pwd", "/digest-auth/auth/usuario/senha/MD5", "httpbin.
2
2 782
Question Chris Stewart · Nov 7, 2016

I'm working on a REST service which will include a binary stream as a request property. I'm currently encoding the stream as BASE64 and passing it as a string value, but I was wondering if there is anything in the Caché JSON support that may be a better fit for encoding this data? Thanks Chris

3
0 1017
Question John Kumpf · Apr 12, 2019

Referencing this post:

https://community.intersystems.com/post/producing-json-sql

I'm not sure how to actually interact with the result set I get from doing something like this.  I want to return something like:

[{"field1":1, "field2":2}, {"field1":2, "field2":10}]

I'm finding it very difficult to get it in this format, since %Print appends a newline onto the end of the {} object it prints.

Here's the closest I've gotten:

set query = "select JSON_OBJECT('field1': field1, 'field2":field2) from MyTable where x=? and y=?"

    set tStatement = ##class(%SQL.Statement).%New()
    set qStatus = tStatement.

5
3 1521