BookmarkSubscribeRSS Feed
JFinkeldey
Calcite | Level 5

Hello:

 

I'm trying to use PROC HTTP to access an API URL that contains double quotes, as shown:

https://example.com/api.pro?method=login&data={ "username":"testuser","password": "testpassword" }

 

This syntax works correctly when pasted directly into a browser.  When run in SAS code as below, the call fails. 

We're running SAS 9.4 (ts1m3).

 

Example:

proc http
url="https://example.com/api.pro?method=login&data={ "username":"testuser","password": "testpassword" }"
method = "POST"
out=resp
headerout=hdrs;
run;

 

The response data from the call is:

{"success":false,"error":"Web services not available at this address","errno":10000}

 

I'm assuming it has to do with the quotes in the URL...

 

Thanks in advance

 

 

7 REPLIES 7
Shmuel
Garnet | Level 18

Try next assignment:

url="https://example.com/api.pro?method=login&data={ ""username"":""testuser"",""password"": ""testpassword"" }"

As the url literal is written between double quotes, each inside pair "" will be treated as one ".

JFinkeldey
Calcite | Level 5

Double quoting causes SAS to interpret the & as a macro variable...

 

WARNING: Apparent symbolic reference DATA not resolved.

 

With response of:

{"success":false,"error":"Web services not available at this address","errno":10000}

 

 

ChrisHemedinger
Community Manager

Your browser is probably swapping in the encoded characters for the double quotes -- but PROC HTTP won't do that for you.  You should probably use the URLENCODE function.  See an example here.  I mocked up something here that might do it.

 

%let values=%sysfunc(urlencode(%str({ "username":"testuser","password": "testpassword" })));
proc http
url="https://example.com/api.pro?method=login%str(&)data=&values."
method = "POST"
out=resp
headerout=hdrs;
run;
Register for SAS Innovate 2025!! The premier event for SAS users, May 6-9 in Orlando FL. Sign up now for the best deals!
JFinkeldey
Calcite | Level 5

That gives me the same response:

{"success":false,"error":"Web services not available at this address","errno":10000}

 

The API documentation says that the info needs to be passed in a variable named DATA.


Is it possible to code that as part of an IN= clause?

ChrisHemedinger
Community Manager

Yes - you should try that.

 

filename resp temp;
filename hdout temp;
proc http
 url="https://example.com/api.pro?method=login"
 method = "POST"
 in='{ "username":"testuser","password": "testpassword" }'
 out=resp
 headerout=hdrs;
run;
Register for SAS Innovate 2025!! The premier event for SAS users, May 6-9 in Orlando FL. Sign up now for the best deals!
JFinkeldey
Calcite | Level 5

Chris:

 

With the in= code the API returns the following:

{"success":false,"error":"Unable to locate \"data\" field in REQUEST","errno":0}

 

That seems like the call can't find the data field, which is expressly identified when putting the entire call on the URL line....

ChrisHemedinger
Community Manager

Can you tell me what service you're trying to use?  Sometimes it helps me to reference the doc for the API in answering these.

 

The "data=" is something we see on the cURL examples that are often provided in API doc, but in that case "data" is a keyword for cURL and not part of the API syntax.  The body of the request -- passed in that data field -- would belong on the IN= param for PROC HTTP.

 

Or...do you have a cURL example that works/should work?  If so, we can transcribe to PROC HTTP.

Register for SAS Innovate 2025!! The premier event for SAS users, May 6-9 in Orlando FL. Sign up now for the best deals!

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 7 replies
  • 1678 views
  • 0 likes
  • 3 in conversation