Help using Base SAS procedures

Passing parameters using PROC HTTP POST method

Reply
Contributor KAZ
Contributor
Posts: 30

Passing parameters using PROC HTTP POST method

[ Edited ]

I am attempting to retrieve a json response from an API.  I am able to get a valid response using curl, but am unable to get PROC HTTP to work.

 

The curl statement requires a -d argument: -d '{"cpId": 1}' 

 

I presume the IN= option in the PROC HTTP statement is the way to go but I receive a Bad Request error:

 

proc http webusername="&_user" webpassword="&_pwd"
    url="&_url"
    in='payload={"cpId": 1}'
    method="POST"
    out=_cpr
    headerout=_cprh;
    headers 'Content-Type' = 'application/json';
run;

I am running 9.4M4.  Any suggestions?

Community Manager
Posts: 3,424

Re: Passing parameters using PROC HTTP POST method

 

With the -d option, I think the server might be expecting the input to be URL encoded, right?

 

Can you try:

 

%let pl = %sysfunc(urlencode(payload={"cpId": 1}));
proc http webusername="&_user" webpassword="&_pwd"
    url="&_url"
    in="&pl."
    method="POST"
    out=_cpr
    headerout=_cprh;
    headers 'Content-Type' = 'application/json';
run;

 

Other stabs in the dark:

Contributor KAZ
Contributor
Posts: 30

Re: Passing parameters using PROC HTTP POST method

Posted in reply to ChrisHemedinger

I am still getting a 400 Bad Request error even after url encoding the IN string.

Community Manager
Posts: 3,424

Re: Passing parameters using PROC HTTP POST method

I just noticed that your curl example does not have the keyword "payload".  Is that correct?

 

If so, can you refine the attempt to:

 

%let pl = %sysfunc(urlencode({"cpId": 1}));
proc http webusername="&_user" webpassword="&_pwd"
    url="&_url"
    in="&pl."
    method="POST"
    out=_cpr
    headerout=_cprh;
    headers 'Content-Type' = 'application/json';
run;

If you can share what API you're trying to access (if it's publicly documented), we might be able to find the right approach.

Contributor KAZ
Contributor
Posts: 30

Re: Passing parameters using PROC HTTP POST method

Posted in reply to ChrisHemedinger

I am attempting to hit the OpenSpecimen -> Get Registrations API.  The documentation is here, but not very helpful.

 

The working curl code, with just the user and url removed is:

 

curl -H "Content-Type: application/json" -X POST -d '{"cpId": 1}' 
Community Manager
Posts: 3,424

Re: Passing parameters using PROC HTTP POST method

I can't get to that link -- hidden behind an Atlassian login.  But have you tried once without the "payload=" and not a urlendoded version of the IN=?

Contributor KAZ
Contributor
Posts: 30

Re: Passing parameters using PROC HTTP POST method

Posted in reply to ChrisHemedinger

Thank You!   For posterity, here is the working code:

 

 

proc http webusername="&_user" webpassword="&_pwd"
    url="&_url"
    in='{"cpId": 1}'
    method="POST"
    out=_cpr
    headerout=_cprh;
    headers 'Content-Type' = 'application/json';
run;

 

Ask a Question
Discussion stats
  • 6 replies
  • 415 views
  • 2 likes
  • 2 in conversation