Save XML response from HTTP POST Request

Potish

Member
I have a simple 4GL program that is utilizing a socket connection to submit a HTTP Post Request to an external web site that responds with a XML document. I am able to able to read the response to a memptr and I now need to save the response to an XML file that can be read later by other programs. I am looking for sample code on how to save the data to an XML file.

I tried to LOAD the data from the memptr to a document handle then SAVE it, but I am either oversimplying it or missing a step as the LOAD method gives an error "file 'MEMPTR', line '1', column '2', message 'Invalid document structure.' (9082)".
 

raveendra

New Member
I have a simple 4GL program that is utilizing a socket connection to submit a HTTP Post Request to an external web site that responds with a XML document. I am able to able to read the response to a memptr and I now need to save the response to an XML file that can be read later by other programs. I am looking for sample code on how to save the data to an XML file.

I tried to LOAD the data from the memptr to a document handle then SAVE it, but I am either oversimplying it or missing a step as the LOAD method gives an error "file 'MEMPTR', line '1', column '2', message 'Invalid document structure.' (9082)".



sir
Could you send me the code of program that you have mention here
 

rstanciu

Member
This is an example to use web-services with 4GL which parse a XML.

to white ...
ll = result:WRITE-XML ("LONGCHAR",lcDoc,YES,?,?,YES,FALSE,TRUE).
ll = result:WRITE-XML ("FILE","c:\tmp\toto",YES,?,?,YES,FALSE,TRUE).

take a look to the "WRITE-XML" in the standard OpenEdge documentation.

Code:
/*******************************************************************/
/* client_IP2Location.p */
/*******************************************************************/
DEFINE VARIABLE hWebService AS HANDLE    NO-UNDO.
DEFINE VARIABLE hPortType   AS HANDLE    NO-UNDO.
DEFINE VARIABLE cResponse   AS CHARACTER NO-UNDO.
DEFINE VARIABLE li          AS INTEGER   NO-UNDO.
DEFINE VARIABLE retValue    AS CHARACTER INITIAL "OK" NO-UNDO.
DEFINE VARIABLE err         AS LOGICAL   NO-UNDO.
DEFINE VARIABLE result      AS LONGCHAR NO-UNDO.
DEFINE VARIABLE currentContent AS CHARACTER NO-UNDO.
DEFINE VARIABLE currentElement AS CHARACTER NO-UNDO.
DEFINE STREAM ls.
/*******************************************************************/
CREATE SERVER hWebService.
ETIME(true).
li = MTIME.

hWebService:CONNECT("-WSDL 'http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl'
  -Service IP2Geo
  -Port IP2GeoSoap").


IF NOT hWebService:CONNECTED() THEN DO:
    MESSAGE "SERVER NOT CONNECTED" VIEW-AS ALERT-BOX.
    retValue = "ERROR".
END.


RUN IP2GeoSoap SET hPortType ON SERVER hWebService NO-ERROR.

IF ERROR-STATUS:ERROR THEN DO:
    MESSAGE "Failed to create hPortType" VIEW-AS ALERT-BOX.
    retValue = "ERROR".
END.

DEFINE VARIABLE monIp AS CHARACTER NO-UNDO.
INPUT-OUTPUT STREAM ls THROUGH VALUE ("monip.sh") NO-ECHO UNBUFFERED.
REPEAT:
  IMPORT STREAM ls UNFORMATTED monIp.
END.
INPUT-OUTPUT STREAM ls CLOSE.
monIp = TRIM(monIp).

RUN ResolveIP IN hPortType (
            INPUT monIp,
            INPUT "0",
            OUTPUT result) NO-ERROR.
RUN ErrorInfo (OUTPUT err).
IF NOT err THEN DO:
    DEFINE VARIABLE hParser as HANDLE.
    CREATE SAX-READER hParser.
    hParser:HANDLER = THIS-PROCEDURE.
    hParser:SET-INPUT-SOURCE("LONGCHAR", result).
    hParser:SAX-PARSE( ) NO-ERROR.
    DELETE OBJECT hParser.
END.
ELSE DO:
    retValue = "ERROR".
END.


DELETE PROCEDURE hPortType.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.

QUIT.
/*******************************************************************/
PROCEDURE StartElement:
  DEFINE INPUT PARAMETER namespaceURI AS CHARACTER.
  DEFINE INPUT PARAMETER localName AS CHARACTER.
  DEFINE INPUT PARAMETER qname AS CHARACTER.
  DEFINE INPUT PARAMETER attributes AS HANDLE.
  currentElement = localName.

END.
/*******************************************************************/
PROCEDURE Characters:
  DEFINE INPUT PARAMETER charData AS MEMPTR.
  DEFINE INPUT PARAMETER numChars AS INTEGER.
  currentContent = GET-STRING(charData, 1, GET-SIZE(charData)).
  IF LENGTH(TRIM(currentContent)) > 0 THEN
   MESSAGE monIp + ": " + currentElement + "=" + currentContent VIEW-AS ALERT-BOX.
END.
/*******************************************************************/
PROCEDURE ErrorInfo:
  DEFINE OUTPUT PARAMETER errorfound AS LOGICAL INITIAL FALSE.
  DEFINE VARIABLE i                  AS INTEGER NO-UNDO.
  DEFINE VARIABLE hSOAPFault         AS HANDLE NO-UNDO.
  DEFINE VARIABLE hSOAPFaultDetail   AS HANDLE NO-UNDO.
  DEFINE VARIABLE HeaderXML AS LONGCHAR VIEW-AS EDITOR SIZE 70 BY 15 LARGE.
  IF ERROR-STATUS:NUM-MESSAGES > 0 THEN DO:
     errorfound = TRUE.
     DO i = 1 TO ERROR-STATUS:NUM-MESSAGES:
        MESSAGE ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX.
     END.
     IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO:
       hSOAPFault = ERROR-STATUS:ERROR-OBJECT-DETAIL.
       MESSAGE
       "Fault Code: "   hSOAPFault:SOAP-FAULT-CODE        SKIP
       "Fault String: " hSOAPFault:SOAP-FAULT-STRING      SKIP
       "Fault Actor: "  hSOAPFault:SOAP-FAULT-ACTOR       SKIP
       "Error Type: "   hSOAPFault:TYPE  VIEW-AS ALERT-BOX.
       IF VALID-HANDLE(hSOAPFault:SOAP-FAULT-DETAIL) THEN  DO:
            hSOAPFaultDetail = hSOAPFault:SOAP-FAULT-DETAIL.
            MESSAGE  "Error Type: " hSOAPFaultDetail:TYPE
                     VIEW-AS ALERT-BOX.
            HeaderXML = hSOAPFaultDetail:GET-SERIALIZED().
            DISPLAY HeaderXML LABEL "Serialized SOAP fault detail"
                    WITH FRAME a.
        END.
     END.
  END.
END PROCEDURE.
/*******************************************************************/
 

maretix

Member
Hi
This is an example to use web-services with 4GL which parse a XML.

to white ...
ll = result:WRITE-XML ("LONGCHAR",lcDoc,YES,?,?,YES,FALSE,TRUE).
ll = result:WRITE-XML ("FILE","c:\tmp\toto",YES,?,?,YES,FALSE,TRUE).

take a look to the "WRITE-XML" in the standard OpenEdge documentation.

Code:
/*******************************************************************/
/* client_IP2Location.p */
/*******************************************************************/
DEFINE VARIABLE hWebService AS HANDLE    NO-UNDO.
DEFINE VARIABLE hPortType   AS HANDLE    NO-UNDO.
DEFINE VARIABLE cResponse   AS CHARACTER NO-UNDO.
DEFINE VARIABLE li          AS INTEGER   NO-UNDO.
DEFINE VARIABLE retValue    AS CHARACTER INITIAL "OK" NO-UNDO.
DEFINE VARIABLE err         AS LOGICAL   NO-UNDO.
DEFINE VARIABLE result      AS LONGCHAR NO-UNDO.
DEFINE VARIABLE currentContent AS CHARACTER NO-UNDO.
DEFINE VARIABLE currentElement AS CHARACTER NO-UNDO.
DEFINE STREAM ls.
/*******************************************************************/
CREATE SERVER hWebService.
ETIME(true).
li = MTIME.
 
hWebService:CONNECT("-WSDL 'http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl'
  -Service IP2Geo
  -Port IP2GeoSoap").
 
 
IF NOT hWebService:CONNECTED() THEN DO:
    MESSAGE "SERVER NOT CONNECTED" VIEW-AS ALERT-BOX.
    retValue = "ERROR".
END.
 
 
RUN IP2GeoSoap SET hPortType ON SERVER hWebService NO-ERROR.
 
IF ERROR-STATUS:ERROR THEN DO:
    MESSAGE "Failed to create hPortType" VIEW-AS ALERT-BOX.
    retValue = "ERROR".
END.
 
DEFINE VARIABLE monIp AS CHARACTER NO-UNDO.
INPUT-OUTPUT STREAM ls THROUGH VALUE ("monip.sh") NO-ECHO UNBUFFERED.
REPEAT:
  IMPORT STREAM ls UNFORMATTED monIp.
END.
INPUT-OUTPUT STREAM ls CLOSE.
monIp = TRIM(monIp).
 
RUN ResolveIP IN hPortType (
            INPUT monIp,
            INPUT "0",
            OUTPUT result) NO-ERROR.
RUN ErrorInfo (OUTPUT err).
IF NOT err THEN DO:
    DEFINE VARIABLE hParser as HANDLE.
    CREATE SAX-READER hParser.
    hParser:HANDLER = THIS-PROCEDURE.
    hParser:SET-INPUT-SOURCE("LONGCHAR", result).
    hParser:SAX-PARSE( ) NO-ERROR.
    DELETE OBJECT hParser.
END.
ELSE DO:
    retValue = "ERROR".
END.
 
 
DELETE PROCEDURE hPortType.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.
 
QUIT.
/*******************************************************************/
PROCEDURE StartElement:
  DEFINE INPUT PARAMETER namespaceURI AS CHARACTER.
  DEFINE INPUT PARAMETER localName AS CHARACTER.
  DEFINE INPUT PARAMETER qname AS CHARACTER.
  DEFINE INPUT PARAMETER attributes AS HANDLE.
  currentElement = localName.
 
END.
/*******************************************************************/
PROCEDURE Characters:
  DEFINE INPUT PARAMETER charData AS MEMPTR.
  DEFINE INPUT PARAMETER numChars AS INTEGER.
  currentContent = GET-STRING(charData, 1, GET-SIZE(charData)).
  IF LENGTH(TRIM(currentContent)) > 0 THEN
   MESSAGE monIp + ": " + currentElement + "=" + currentContent VIEW-AS ALERT-BOX.
END.
/*******************************************************************/
PROCEDURE ErrorInfo:
  DEFINE OUTPUT PARAMETER errorfound AS LOGICAL INITIAL FALSE.
  DEFINE VARIABLE i                  AS INTEGER NO-UNDO.
  DEFINE VARIABLE hSOAPFault         AS HANDLE NO-UNDO.
  DEFINE VARIABLE hSOAPFaultDetail   AS HANDLE NO-UNDO.
  DEFINE VARIABLE HeaderXML AS LONGCHAR VIEW-AS EDITOR SIZE 70 BY 15 LARGE.
  IF ERROR-STATUS:NUM-MESSAGES > 0 THEN DO:
     errorfound = TRUE.
     DO i = 1 TO ERROR-STATUS:NUM-MESSAGES:
        MESSAGE ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX.
     END.
     IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO:
       hSOAPFault = ERROR-STATUS:ERROR-OBJECT-DETAIL.
       MESSAGE
       "Fault Code: "   hSOAPFault:SOAP-FAULT-CODE        SKIP
       "Fault String: " hSOAPFault:SOAP-FAULT-STRING      SKIP
       "Fault Actor: "  hSOAPFault:SOAP-FAULT-ACTOR       SKIP
       "Error Type: "   hSOAPFault:TYPE  VIEW-AS ALERT-BOX.
       IF VALID-HANDLE(hSOAPFault:SOAP-FAULT-DETAIL) THEN  DO:
            hSOAPFaultDetail = hSOAPFault:SOAP-FAULT-DETAIL.
            MESSAGE  "Error Type: " hSOAPFaultDetail:TYPE
                     VIEW-AS ALERT-BOX.
            HeaderXML = hSOAPFaultDetail:GET-SERIALIZED().
            DISPLAY HeaderXML LABEL "Serialized SOAP fault detail"
                    WITH FRAME a.
        END.
     END.
  END.
END PROCEDURE.
/*******************************************************************/
Rst
 

maretix

Member
This is an example to use web-services with 4GL which parse a XML.

to white ...
ll = result:WRITE-XML ("LONGCHAR",lcDoc,YES,?,?,YES,FALSE,TRUE).
ll = result:WRITE-XML ("FILE","c:\tmp\toto",YES,?,?,YES,FALSE,TRUE).

take a look to the "WRITE-XML" in the standard OpenEdge documentation.

Code:
/*******************************************************************/
/* client_IP2Location.p */
/*******************************************************************/
DEFINE VARIABLE hWebService AS HANDLE    NO-UNDO.
DEFINE VARIABLE hPortType   AS HANDLE    NO-UNDO.
DEFINE VARIABLE cResponse   AS CHARACTER NO-UNDO.
DEFINE VARIABLE li          AS INTEGER   NO-UNDO.
DEFINE VARIABLE retValue    AS CHARACTER INITIAL "OK" NO-UNDO.
DEFINE VARIABLE err         AS LOGICAL   NO-UNDO.
DEFINE VARIABLE result      AS LONGCHAR NO-UNDO.
DEFINE VARIABLE currentContent AS CHARACTER NO-UNDO.
DEFINE VARIABLE currentElement AS CHARACTER NO-UNDO.
DEFINE STREAM ls.
/*******************************************************************/
CREATE SERVER hWebService.
ETIME(true).
li = MTIME.
 
hWebService:CONNECT("-WSDL 'http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl'
  -Service IP2Geo
  -Port IP2GeoSoap").
 
 
IF NOT hWebService:CONNECTED() THEN DO:
    MESSAGE "SERVER NOT CONNECTED" VIEW-AS ALERT-BOX.
    retValue = "ERROR".
END.
 
 
RUN IP2GeoSoap SET hPortType ON SERVER hWebService NO-ERROR.
 
IF ERROR-STATUS:ERROR THEN DO:
    MESSAGE "Failed to create hPortType" VIEW-AS ALERT-BOX.
    retValue = "ERROR".
END.
 
DEFINE VARIABLE monIp AS CHARACTER NO-UNDO.
INPUT-OUTPUT STREAM ls THROUGH VALUE ("monip.sh") NO-ECHO UNBUFFERED.
REPEAT:
  IMPORT STREAM ls UNFORMATTED monIp.
END.
INPUT-OUTPUT STREAM ls CLOSE.
monIp = TRIM(monIp).
 
RUN ResolveIP IN hPortType (
            INPUT monIp,
            INPUT "0",
            OUTPUT result) NO-ERROR.
RUN ErrorInfo (OUTPUT err).
IF NOT err THEN DO:
    DEFINE VARIABLE hParser as HANDLE.
    CREATE SAX-READER hParser.
    hParser:HANDLER = THIS-PROCEDURE.
    hParser:SET-INPUT-SOURCE("LONGCHAR", result).
    hParser:SAX-PARSE( ) NO-ERROR.
    DELETE OBJECT hParser.
END.
ELSE DO:
    retValue = "ERROR".
END.
 
 
DELETE PROCEDURE hPortType.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.
 
QUIT.
/*******************************************************************/
PROCEDURE StartElement:
  DEFINE INPUT PARAMETER namespaceURI AS CHARACTER.
  DEFINE INPUT PARAMETER localName AS CHARACTER.
  DEFINE INPUT PARAMETER qname AS CHARACTER.
  DEFINE INPUT PARAMETER attributes AS HANDLE.
  currentElement = localName.
 
END.
/*******************************************************************/
PROCEDURE Characters:
  DEFINE INPUT PARAMETER charData AS MEMPTR.
  DEFINE INPUT PARAMETER numChars AS INTEGER.
  currentContent = GET-STRING(charData, 1, GET-SIZE(charData)).
  IF LENGTH(TRIM(currentContent)) > 0 THEN
   MESSAGE monIp + ": " + currentElement + "=" + currentContent VIEW-AS ALERT-BOX.
END.
/*******************************************************************/
PROCEDURE ErrorInfo:
  DEFINE OUTPUT PARAMETER errorfound AS LOGICAL INITIAL FALSE.
  DEFINE VARIABLE i                  AS INTEGER NO-UNDO.
  DEFINE VARIABLE hSOAPFault         AS HANDLE NO-UNDO.
  DEFINE VARIABLE hSOAPFaultDetail   AS HANDLE NO-UNDO.
  DEFINE VARIABLE HeaderXML AS LONGCHAR VIEW-AS EDITOR SIZE 70 BY 15 LARGE.
  IF ERROR-STATUS:NUM-MESSAGES > 0 THEN DO:
     errorfound = TRUE.
     DO i = 1 TO ERROR-STATUS:NUM-MESSAGES:
        MESSAGE ERROR-STATUS:GET-MESSAGE(i) VIEW-AS ALERT-BOX.
     END.
     IF VALID-HANDLE(ERROR-STATUS:ERROR-OBJECT-DETAIL) THEN DO:
       hSOAPFault = ERROR-STATUS:ERROR-OBJECT-DETAIL.
       MESSAGE
       "Fault Code: "   hSOAPFault:SOAP-FAULT-CODE        SKIP
       "Fault String: " hSOAPFault:SOAP-FAULT-STRING      SKIP
       "Fault Actor: "  hSOAPFault:SOAP-FAULT-ACTOR       SKIP
       "Error Type: "   hSOAPFault:TYPE  VIEW-AS ALERT-BOX.
       IF VALID-HANDLE(hSOAPFault:SOAP-FAULT-DETAIL) THEN  DO:
            hSOAPFaultDetail = hSOAPFault:SOAP-FAULT-DETAIL.
            MESSAGE  "Error Type: " hSOAPFaultDetail:TYPE
                     VIEW-AS ALERT-BOX.
            HeaderXML = hSOAPFaultDetail:GET-SERIALIZED().
            DISPLAY HeaderXML LABEL "Serialized SOAP fault detail"
                    WITH FRAME a.
        END.
     END.
  END.
END PROCEDURE.
/*******************************************************************/
Hi Rstanciu.
I read you post.

I am using WRITE-XML method within WEBSPEED applications.

I was able to create an XML Document using WRITE-XML Method but i have a question to do to you.

How can i post XML through WEB using WRITE-XML Method ???
I was able to create a LONGCHAR or a XML FILE on a folder...but not to post this file through WEBSTREAM in WEBSPEED Applications.
I read PROGRESS DOCUMENTATION and i understood there is a target type STREAM, i did examples but nothing to do ...

Can you help me ???

I have a PRO DATASET with all my data ...

lReturn = hPDS:
WRITE-XML(cTargetType,cFile,lFormatted, cEncoding, cSchemaLocation, lWriteSchema, lMinSchema).

I tried to assign cTargetType variable to "STREAM" but nothing to do...
How can i have to set these variables

cTARGETYPE
cFile
.....

Thanks you very much if you can help me...
 
Top