#REST API

10 Followers · 627 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.

Article Rob Tweed · Aug 17, 2017 1m read

Quite a few enhancements have appeared over recent months in QEWD for easing and simplifying the creation of REST-based services.  It's now even more slick and powerful,  allowing you to very quickly create very high-performance, highly-scalable REST (and Web) services that make use of Cache.

I've therefore updated the training presentation deck (Part 31 on developing REST Services with QEWD).  It describes all the new features with worked examples.  See:

https://www.slideshare.net/robtweed/ewd-3-training-course-part-31-ewdxp…

1
0 574
Question George Hodder · Jul 17, 2017

Hi,

I am new to coding web services and trying to connect to an API that returns its format in xml or json.

I have a class as follows.. when I run I get back a 6059 in my status - Unable to open TCP/IP socket to server

Can someone help me identify what I am missing?  Thanks

Class Common.WebDownload Extends (%RegisteredObject, %XML.Adaptor){ClassMethod Connect(){  Set aa=##class(%Net.HttpRequest).%New()  Set aa.Server="https://www.actualwebaddresshere.com"  Set aa.Location="/service/actual location path and my API key here/"  Set aa.ContentType="text/xml"  set bb=aa.Get()  break
12
0 3401
Question Sébastien Demoustiez · Jul 27, 2017

Hello,

I have a DB server (ser-app-db) where cache is installed as server.

I have a Web server (ser-app-w) where cache is installed as web server and configured as CSP gateway.

I followed the configuration guide (https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KE…) and ser-app-w perfectly display the CSP and CLS pages.

But that's not working for my REST service, for exemple with the REST sample:

http://ser-app-db/csp/samples/docserver/request(GET): work and show the request

http://ser-app-w/csp/samples/docserver/request(GET): return a 404.

Can someone

9
0 1533
Question Sebastian Mueller · Jul 24, 2017

Hello fellow developers,

I am currently in need of a way to serve files dynamically (sending specific replacements for when the requested file doesn't exist, possibly depending on other conditions such as passed parameters).

6
0 1356
Question Rubens Silva · Jul 27, 2017

Hello.
I'm having difficulties trying to figure (if possible) how to  create an URL that also matches query parameters.
I tried:
 <Route Url="/:namespace/test(\?id\=):id" Method="GET" Call="Test"/>
 <Route Url="/:namespace/test?(id)=:id" Method="GET" Call="Test"/>
 <Route Url="/:namespace/test?id=:id" Method="GET" Call="Test"/>

But none of these worked.

Is it possible when using %CSP.REST or am I restricted to using route parameters?
Thank you.
EDIT:
 

Forget about the "id" parameter name. It's a bad sample: normally id are by definition, able to be hierarchically included in the URI.
Think on id as

5
0 2627
Article Fabian Haupt · Sep 2, 2016 2m read

By now it's a commonplace how to implement a basic REST API in Caché and there is good documentation about it here: REST in Caché

A question that comes up from time to time is:

How can I make a parameter in my REST url optional?

Simply put, is it possible to create a URL map in Caché that maps a URL like this:

http://server/API/object///old

While this might look odd, this is actually a valid URL. You can read the details in RFC3986 section 3.3.

The framework provided by %CSP.Rest actually allows us to create maps that match the above URL.

1
1 2897
Question CM Wang · Jul 14, 2017

Hi,

I have a UrlMap like the one below.

<Route Url="/Results/:queryID" Method="POST" Call="QueryResults"/>

What if I have to pass two parameters to QueryResults, how to do configure Url?

Something like Url="/Results/:queryID/:parameter2"   ?

Thanks.

1
0 793
Question Stefan Cronje · Jul 10, 2017

Hi everyone,

I have a project which requires the sending of JSON messages to an external service provider using REST. The service provider requires the message contents to be signed.

Their instructions:

  1. Add a header called "Date" with the the date and time in a specific format - done
  2. Add the client's certificate password in a field in the header - done
  3. Create a string which consist of the {Date}{newline}{Password}{newline}{etc}{Message Body}.
    1. Convert to a UTF8 byte array
    2. SHA256 sign the value with the certificate and private key and use RSA PSS padding
    3. Base 64 Encode the value and place it in a
8
0 14479
Question Jeffrey Semmens · Jun 15, 2017

I am trying to design a RESTful service that takes a string (with control characters). Does something with that in the logic on the server, then returns a string, which may also have control characters.

Basically the string is a pharmacy claim in a delimited format that uses control characters for those delimiters. The logic on the server will pull the entire claim apart and process it.

I was thinking that a GET method could be uses but I'm used to sending content in JSON format and wondered what other normal RESTful ways there were to do this.

4
0 896
Question Javier Gonzalez · Jun 6, 2017

Hello everyone,

I'm doing a REST service for integration between 2 systems. The system that invokes me expects a response object where only one of its attributes changes. It could be something like this:

Class ResponseCustomer  {
    Property Code As %String;
    Property Info As Customer;
}
Class ResponseAppointment {
    Property Code As %String;
    Property Info As Appointment;
}
Class ResponseCancellation  {
​    Property Code As %String;
    Property Info As %String;
}

To avoid creating almost identical objects for each of the methods of my REST service, I had thought to implement

3
0 664
Article Chris Stewart · Apr 25, 2017 5m read

In our last lesson, we implemented a linkage to our WidgetAccessory class, and debugged some errors we encountered along the way.  We now have our data being returned by REST, but what if we want to update or add new data to our application?  

So far we have only used HTTP GET commands with our REST Services, we now have to implement PUT (which roughly corresponds to an Update) and a POST (which roughly corresponds to a Create.  Author's note: there is a lot of writing online about why this statement isn't entirely correct, I'm not going to go into the detail here).  However, before we start,

7
0 2596
Article Chris Stewart · Apr 24, 2017 4m read

or "Things are going to break"

We left our application over the weekend, secure in the knowledge that it was returning data from our primary persistent class, User.Widget.  However, Widgets Direct are the premier supplier of both Widgets AND Widget Accessories, so we should really start working on adding these Accessories to our application. 

We should do some housekeeping first though.

3
0 1485
Article Rob Tweed · May 22, 2017 1m read

Most frameworks support either REST or WebSockets, and don't make it easy to switch between the two, and/or support both styles of application at the same time.  WebSockets offer many advantages over REST, eg:

- most benchmarks show WebSocket messaging to be significantly faster than over HTTP

- you break free of the HTTP Request/Response protocol limitations, allowing the server/back-end to send messages to the browser as and when it wishes, not simply when polled by the browser.

1
0 534
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 10284
Article Rob Tweed · May 1, 2017 1m read

Something that shot up the popularity stakes last week was this article on a very interesting initiative: RealWorld:

https://medium.com/@ericsimons/introducing-realworld-6016654d36b5

I decided it would be a good idea to use this as a way of creating an exemplar implementation of a RESTful back-end using QEWD against their published API (https://github.com/gothinkster/realworld/tree/master/api)

The results are here:

https://github.com/robtweed/qewd-conduit

Actually it's the first 3rd-party implementation out of the blocks!

Although I state that it uses Redis as the database, you can seamlessly swap

14
0 1418
Article Chris Stewart · May 8, 2017 3m read

In our last lesson, we added some formatting and validation to our Edit Widget form.  So, now we are ready to add the ability to add new Widgets to our application.  However, the great Widget Wars have come to an abrupt end, as Widget Direct has purchased its biggest competitor, WorldWideWidgets.  In order to maintain some continuity, we need to display their catalog on our new application.

So, we have good news and bad news.

0
0 916
Article Chris Stewart · May 6, 2017 2m read

In our last lesson, we added a form to Edit our existing Widgets, and save them back to the server.  However, our Form was not well structured and our Save button had no intelligence, and was not fully visible.  So today, we will apply some Material components and Angular style to make the form more useful

Let's open EditWidget.csp, and make some changes.

0
0 965
Question Kurro Lopez · May 4, 2017

Hi all,

I've a RESP API service in a Business Service to server different methods

I've created the route with the name of the method, each one has been created in lowercase 

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="/user" Method="POST" Call="User"/>
    <Route Url="/emailactivation" Method="POST" Call="EmailActivation" />
    <Route Url="/login" Method="POST" Call="Login"/>
</Routes>
}

But only there is a response if the call is used in lowercase

http://localhost:57772/mynamespace/emailactivation

my question is, is it possible to create

2
0 1233
Question Eduard Lebedyuk · Apr 26, 2017

I heed to his a callback method after all REST call. I have already found a method to call before REST call, but after eludes me. Here's the code:

Class Test.REST Extends %CSP.REST
{

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>

<Route Url="/:classname" Method="GET" Call="TEST" Cors="true"/>

</Routes>
}

/// This method Gets called prior to dispatch of the request. Put any common code here
/// that you want to be executed for EVERY request. If pContinue is set to 0, the
/// request will NOT be dispatched according to the UrlMap. If this case
5
0 871
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?

t

7
0 2879
Article Chris Stewart · Apr 21, 2017 2m read

At the end of our last lesson, we ended with our page displaying a nice (but garish) Angular Material Toolbar, and our Widget data displaying in a list of Material cards.  Our page feels a bit static, and we already know that the large number of Widgets that we will be dealing with will not be especially usable on a static list.  What can we do to help?


A filtering function would be very helpful, so let's add a text input to the top of the page.

0
0 1506
Article Chris Stewart · Apr 19, 2017 3m read

We finished our last lesson with our Widgets Direct page receiving a Welcome message as a property of a JSON object, which was unpacked and displayed on the page. However, we are on Lesson 3, and we still haven't had any talk of displaying widgets yet.  

Let's change that.  Widgets Direct are a leader in widget and widget accessories, so we clearly have numerous items to display.   To transfer this, we will need to declare and return our first array.  Let's go back to our REST.Dispatch class, and add this data to our Service.

Adding an array is simple, but we need to set up some temporary

0
0 1975
Question Greg Arnold · Apr 12, 2017

We are using an F5 load balancer to route public traffic to our IS server. My goal is to block public access to the Management Portal, and only allow what we want to expose, such as REST/SOAP services. At the F5, they can block URL wildcards or specific ports, so those are our options.

Since the URLs for the web services are in the same path ([host]/csp/healthshare/[namespace]/*), I can't see any URL wildcards happening. That leads me to ports; is there a way to put services on a specific port for all services, and everything else stay on a standard web port?

Any insight or ideas would be

5
0 449