Using .Net to Get Data from PASOE

Posted by Jeff Ledbetter on 12-Oct-2016 16:11

Hi.

After having some luck with curl using something like this:

curl -X GET -v http://localhost:16680/oemanager/applications/ -u tomcat:tomcat

..I am now trying to get this same information from the tomcat server in PASOE using .Net. Unfortunately, I am unable to get past the 401 Unauthorized error.

Am I way off base?

webClient = NEW WebClient().
myUri     = NEW Uri("http://wintest").
netCred   = NEW NetworkCredential("tomcat", "tomcat").
credCache = NEW CredentialCache().

credCache:Add(myUri, "Basic", netCred).

webClient:Credentials = credCache.

ASSIGN
  cURI     = "wintest:8810/.../applications"
  lcString = webClient:DownloadString (cURI).
  
webClient:Dispose() .

Posted by mroberts@rev.com.au on 12-Oct-2016 17:54

Migrated the above to 4GL ... mistook the request and the answer I provided was in C# (oops).  OE did not like the casting of the repose to HttpWebResponse ... but removing that seemed to work.

USING System.IO.*.

USING System.Net.*.

define variable req         as System.Net.WebRequest        no-undo.

define variable resp        as System.Net.WebResponse       no-undo.

define variable dataStream  as System.IO.Stream             no-undo.

define variable reader      as System.IO.StreamReader       no-undo.

define variable json        as character                    no-undo.

req = WebRequest:Create("revdevelev:7060/.../applications").

req:Credentials = new NetworkCredential("tomcat","tomcat").

req:Method = "GET".

resp = req:GetResponse().

dataStream = resp:GetResponseStream().

reader = new StreamReader(dataStream).

json = reader:ReadToEnd().

All Replies

Posted by Irfan on 12-Oct-2016 16:22

Can you please look at fiddler or any proxy to see what has been sent from the client ?

Posted by mroberts@rev.com.au on 12-Oct-2016 16:37

Jeff,

This works for me

           WebRequest req = WebRequest.Create("server:7060/.../applications");

           req.Credentials = new NetworkCredential("tomcat","tomcat");

           req.Method = "GET";

           HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

           Stream dataStream = resp.GetResponseStream();

           StreamReader reader = new StreamReader(dataStream);

           String json = reader.ReadToEnd();

           Console.WriteLine(json);

I've never used the CredentialCache ... leaving it out and trying webClient:Credentials = netCred might work?

Mark

Posted by mroberts@rev.com.au on 12-Oct-2016 17:54

Migrated the above to 4GL ... mistook the request and the answer I provided was in C# (oops).  OE did not like the casting of the repose to HttpWebResponse ... but removing that seemed to work.

USING System.IO.*.

USING System.Net.*.

define variable req         as System.Net.WebRequest        no-undo.

define variable resp        as System.Net.WebResponse       no-undo.

define variable dataStream  as System.IO.Stream             no-undo.

define variable reader      as System.IO.StreamReader       no-undo.

define variable json        as character                    no-undo.

req = WebRequest:Create("revdevelev:7060/.../applications").

req:Credentials = new NetworkCredential("tomcat","tomcat").

req:Method = "GET".

resp = req:GetResponse().

dataStream = resp:GetResponseStream().

reader = new StreamReader(dataStream).

json = reader:ReadToEnd().

Posted by Jeff Ledbetter on 13-Oct-2016 08:12

Irfan, I've not used Fiddler before. I will take a look at it. It will be educational.

Mark, what you sent along appears to work. Thank you. I see that you are using WebRequest while I was using WebClient.  Do you know if it's possible to use WebClient and achieve a successful result?

Posted by Peter Judge on 13-Oct-2016 08:32

Jeff,

You can also use ABL for this.

There are some samples on GitHub, specifically https://github.com/PeterJudge-PSC/http_samples/blob/master/http_client/pasoe_rest_api/get_applications.p

/*------------------------------------------------------------------------
    File        : get_applications.p
    Purpose     : Returns the list of applications from a PASOE server
    Author(s)   : pjudge 
    Created     : Thu Oct 13 09:17:32 EDT 2016
    Notes       : * this is the equivalent of curl -X GET -v localhost:16680/.../ -u tomcat:tomcat
  ----------------------------------------------------------------------*/
block-level on error undo, throw.

using OpenEdge.Net.HTTP.ClientBuilder.
using OpenEdge.Net.HTTP.Credentials.
using OpenEdge.Net.HTTP.IHttpClient.
using OpenEdge.Net.HTTP.IHttpRequest.
using OpenEdge.Net.HTTP.RequestBuilder.
using OpenEdge.Net.URI.
using OpenEdge.Net.HTTP.IHttpResponse.
using Progress.Json.ObjectModel.JsonObject.

/* ***************************  Session config  *************************** */
/* OPTIONAL FOR DEBUG/TRACING

session:error-stack-trace = true.
log-manager:logging-level = 6.
log-manager:logfile-name = session:temp-dir + 'get_applications.log'.
log-manager:clear-log().

*/

/* ***************************  Main Block  *************************** */
define variable oClient as IHttpClient no-undo.
define variable oUri as URI no-undo.
define variable oReq as IHttpRequest no-undo.
define variable oResp as IHttpResponse no-undo.
define variable oCreds as Credentials no-undo.
define variable oJson as JsonObject no-undo.

oClient = ClientBuilder:Build():Client.

oCreds = new Credentials('', 'tomcat', 'tomcat').

oUri = new URI('http', 'localhost', 16680).
oUri:Path = '/oemanager/applications/'.
     
oReq = RequestBuilder:Get(oUri)
            :UsingCredentials(oCreds)
            :Request.
            
oResp = oClient:Execute(oReq).

if type-of(oResp:Entity, JsonObject) then
    assign oJson = cast(oResp:Entity, JsonObject).
    
/* do what you need to with the JSON here */    

catch oError as Progress.Lang.Error :
    message 
        oError:GetMessage(1) skip(2)
        oError:CallStack
    view-as alert-box.		
end catch.

Posted by Jeff Ledbetter on 13-Oct-2016 08:36

Thanks Peter. I was just perusing the docs for this class(es). This example will be quite helpful.

Posted by mroberts@rev.com.au on 13-Oct-2016 20:55

Jeff,

WebcClient does work for me too.

webClient = NEW WebClient().

netCred   = NEW NetworkCredential("tomcat", "tomcat").

webClient:Credentials = netCred.

ASSIGN lcString = webClient:DownloadString ("server:7060/.../applications").

webClient:Dispose() .

message lcString view-as alert-box.

Mark

Posted by Jeff Ledbetter on 18-Oct-2016 15:44

Thanks Mark. That works as well. I suppose I was making it too complicated, but I was trying to follow the pattern found on MSDN. :)

This thread is closed