Web service client in Progress V9.1e

mokeyh

New Member
Hello,

Can anyone help - I need to run/consume a web-service from a Progress V9.1e client. The web service is up and running and I can run it with no problems from an Openedge (V10) client.

I have tried and failed...

Firstly, here is my working V10 code:

/*v10 code...*/
DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hWorkFlowWSService AS HANDLE NO-UNDO.
DEFINE VARIABLE o-session AS CHARACTER NO-UNDO.

CREATE SERVER hWebService.
hWebService:CONNECT("-WSDL 'http://rapsbmdev:18793/sbm/services/BizLogic1?wsdl'
-Service WorkFlowWSService
-Port BizLogic1").

RUN VALUE("WorkFlowWS") SET hWorkFlowWSService ON hWebService.

/* Procedure invocation of START operation. */
RUN connect IN hWorkFlowWSService ( INPUT "user",
INPUT "password",
OUTPUT o-session).

MESSAGE "o-session" o-session VIEW-AS ALERT-BOX INFO BUTTONS OK.
RUN DISCONNECT IN hWorkFlowWSService (INPUT o-session).


And here is my (non-working) v9 attempt...

DEFINE VARIABLE v-hSocket AS HANDLE NO-UNDO.
DEFINE VARIABLE v-port AS CHAR NO-UNDO.
DEFINE VARIABLE v-mData AS MEMPTR NO-UNDO.
DEFINE VARIABLE v-iDataSize AS INTEGER NO-UNDO.
DEFINE VARIABLE v-return AS LOGICAL NO-UNDO.
DEFINE VARIABLE o-mData AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-before AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-time AS INTEGER NO-UNDO.
DEFINE VARIABLE v-timeout AS INTEGER NO-UNDO INIT 2.
DEFINE VARIABLE iMessageSize AS INTEGER NO-UNDO INIT 50.
DEFINE VARIABLE lv-xml AS CHARACTER NO-UNDO.

ASSIGN v-port = "-H rapsbmdev -S 18793". /*rapsbmdev*/
ASSIGN lv-xml = '<?xml version="1.0" ?>' +
'<soap:Envelope xmlns:soap="
http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="
http://www.w3.org/2001/12/soap-encoding"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="
http://www.w3.org/2001/XMLSchema">' +
'<soap:Body>' +
'<m:connect xmlns:m="
http://rapsbmdev:18793/sbm/services/BizLogic1/WorkFlowWSService">' +

'<m:userid xsi:type="xsd:string">rapid</m:userid>' +
'<m:password xsi:type="xsd:string">rapid1</m:password>' +

'</m:connect>' +
'</soap:Body>' +
'</soap:Envelope>' . /*+ CHR(13) + CHR(10)?*/

SET-SIZE(v-mData) = 0.
SET-SIZE(v-mData) = LENGTH(lv-xml).

PUT-STRING(v-mData,1,LENGTH(lv-xml) ) = lv-xml.
ASSIGN v-before = GET-STRING(v-mdata,1).
MESSAGE "outgoing xml..." SKIP v-before VIEW-AS ALERT-BOX INFO BUTTONS OK.

CREATE SOCKET v-hSocket.
v-hSocket:CONNECT(v-port) NO-ERROR.
IF v-hSocket:CONNECTED() = FALSE THEN
MESSAGE "Not connected." VIEW-AS ALERT-BOX INFO BUTTONS OK.
ELSE
MESSAGE "Connected!" VIEW-AS ALERT-BOX INFO BUTTONS OK.

v-hSocket:SET-READ-RESPONSE-PROCEDURE('ip-ProcessServerResponse':U).
/*SET-BYTE-ORDER(v-mData) = BIG-ENDIAN. */
v-iDataSize = GET-SIZE(v-mData).

MESSAGE "v-iDataSize" v-iDataSize VIEW-AS ALERT-BOX INFO BUTTONS OK.
v-return = v-hSocket:WRITE(v-mData,1,v-iDataSize) NO-ERROR.
IF v-return = FALSE OR ERROR-STATUS:GET-MESSAGE(1) <> '':U THEN
DO:
MESSAGE "failed write" VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.
END.

PAUSE 1.
REPEAT ON STOP UNDO, LEAVE ON QUIT UNDO, LEAVE:
IF v-hSocket:connected() THEN
DO:
IF OPSYS <> "unix" THEN
DO:
IF v-time >= v-timeout THEN
DO:
MESSAGE "giving up - timed out waiting for response" VIEW-AS ALERT-BOX INFO BUTTONS OK.
LEAVE.
END.

WAIT-FOR READ-RESPONSE OF v-hSocket PAUSE 1. /* pause for 1 sec between repeats */
ASSIGN v-time = v-time + 1.
END.
ELSE
DO:
iMessageSize = v-hsocket:GET-BYTES-AVAILABLE().
v-return = v-hsocket:READ(v-mData,1,iMessageSize,2) NO-ERROR.
PAUSE 1.
IF v-return = TRUE AND ERROR-STATUS:GET-MESSAGE(1) = '':U
AND v-before <> GET-STRING(v-mdata,1)
AND GET-STRING(v-mdata,1) <> "" THEN
DO:
RUN ip-processserverresponse.
LEAVE.
END.
ELSE
DO:
IF v-time >= v-timeout THEN
DO:
MESSAGE "giving up - timed out waiting for response" VIEW-AS ALERT-BOX INFO BUTTONS OK.
LEAVE.
END.
ASSIGN v-time = v-time + 1.
END.
END.
END.
ELSE
LEAVE.
END.

v-hSocket:DISCONNECT() NO-ERROR.
DELETE OBJECT v-hSocket.


PROCEDURE ip-ProcessServerResponse:

DEFINE VARIABLE cTime AS CHARACTER FORMAT "x(65)":U NO-UNDO.
DEFINE VARIABLE iMessageSize AS INTEGER NO-UNDO.
DEFINE VARIABLE v-iCount AS INTEGER NO-UNDO.

IF v-hSocket:CONNECTED() = FALSE THEN
RETURN.

ASSIGN iMessageSize = v-hSocket:GET-BYTES-AVAILABLE().
SET-SIZE(v-mData) = 0.
SET-SIZE(v-mData) = iMessageSize.

v-return = SELF:READ(v-mData,1,iMessageSize,2) NO-ERROR.

IF v-return = FALSE OR ERROR-STATUS:GET-MESSAGE(1) <> '':U THEN
DO:
MESSAGE "failed read" VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.
END.

/* Returned file */
ASSIGN o-mData = GET-STRING(v-mData,1).

MESSAGE o-mdata VIEW-AS ALERT-BOX INFO BUTTONS OK.
END PROCEDURE.


As you can see I'm using sockets directly and constructing my own SOAP message. The connect seems to work ok and the write to socket returns no error. But I am not getting a response from the web-service and I suspect my XML may not be being received or may be incorrect somehow...

Any help would be greatly appreciated! Many Thanks.
 

Stefan

Well-Known Member
How about connecting your 9.1E client to a 10 AppServer and letting that do the work?
 

Marian EDU

Member
are you sure this goes without error???
Code:
SET-SIZE(v-mData) = LENGTH(lv-xml). 
PUT-STRING(v-mData,1,LENGTH(lv-xml) ) = lv-xml.

other than that, grab a http sniffer and see what is the exact soap message sent by the OE10 client
 

mokeyh

New Member
The httpsniffer sounds useful - can you recommend one in particular?

Yes, there is no error from the two lines you mentioned, although the progress help on the put-string command does not tell you to put the = in - it will not compile without...

Thanks.
 
Top