Using SAS with REST APIs is fun and rewarding, but it's also complicated. When you're dealing with web services, credentials, data parsing and security, there are a lot of things that can go wrong. It's useful to have a simple program that verifies that the "basic plumbing" is working before you try to push a lot of complex coding through it.
I'm gratified that many of my readers are able to adapt my API examples and achieve similar results. When I receive a message from a frustrated user who can't get things to work, the cause is almost always one of the following:
- Not using a recent enough version of SAS. PROC HTTP was revised and improved in SAS 9.4 Maint 3. The JSON library engine was added in SAS 9.4 Maint 4 (released in 2016). It's time to upgrade!
- Cannot access the web service through a corporate firewall. Use the various PROXY-related options to tell PROC HTTP how to connect through your network gateway, if necessary.
- No SSL support installed/configured (required for HTTPS access). This is rarely an issue on Windows systems, but on UNIX systems an admin must configure SSL certificates with the SSLCALISTLOC= option.
The following SAS program is a simple plumbing test. It uses a free HTTP test service (httpbin.org) to verify your Internet connectivity from SAS and your ability to use SSL. The endpoint returns a JSON-formatted echo response, which the program parses using the JSON library engine. I have successfully run this program from my local SAS on Windows and from SAS OnDemand for Academics (using SAS Studio).
If you can run this program successfully from your SAS session, then you're ready to attempt the more complex REST API calls. If you encounter any errors while running this simple test, then you will need to resolve these before moving on to the really useful APIs. (Like maybe checking on who is in space right now...)
/* PROC HTTP and JSON libname test */ /* Requires SAS 9.4m4 or later to run */ /* Also works on SAS OnDemand for Academics */ filename resp "%sysfunc(getoption(WORK))/echo.json"; proc http url="https://httpbin.org/stream/1" method="GET" out=resp; run; /* Special macro vars supported with SAS 9.4 Maint 5 */ %put HTTP Status code = &SYS_PROCHTTP_STATUS_CODE. : &SYS_PROCHTTP_STATUS_PHRASE.; /* JSONPP function supported with SAS 9.4 Maint 6 */ data _null_; rc = jsonpp('resp','log'); run; /* Tell SAS to parse the JSON response */ libname stream JSON fileref=resp; title "JSON library structure"; proc datasets lib=stream; quit; /* interpret the various header fields */ data values(drop=ord:); merge stream.root stream.headers; by ordinal_root; run; title "Headers and URL data"; proc print data=values; run; libname stream clear; filename resp clear;