Salesforce

How to send a POST to a REST service using ABL Sockets?

« Go Back

Information

 
TitleHow to send a POST to a REST service using ABL Sockets?
URL Namehow-to-send-a-post-to-a-rest-service-using-abl-sockets
Article Number000131020
EnvironmentProduct: OpenEdge
Version: All Supported Versions
OS: All Supported Platforms
Question/Problem Description

The below example code demonstrates using ABL Sockets to POST JSON to a REST service.
 
Steps to Reproduce
Clarifying Information

The below code passes a record with two fields to a fictional web service and receives a response.
 
Error Message
Defect Number
Enhancement Number
Cause
Resolution
USING Progress.Lang.*.
USING Progress.Json.ObjectModel.JsonObject.

ROUTINE-LEVEL ON ERROR UNDO, THROW. 

DEFINE TEMP-TABLE ttRecord
    FIELD requestField1 AS CHARACTER 
    FIELD requestField2 AS CHARACTER.

DEFINE INPUT PARAMETER TABLE FOR ttRecord.

PROCEDURE postRequest:        
    DEFINE VARIABLE hSocket      AS HANDLE       NO-UNDO.

    DEFINE VARIABLE lcRequest    AS LONGCHAR     NO-UNDO.
    DEFINE VARIABLE lcData       AS LONGCHAR     NO-UNDO.

    DEFINE VARIABLE mRequest     AS MEMPTR       NO-UNDO.
    DEFINE VARIABLE mCredentials AS MEMPTR       NO-UNDO.

    DEFINE VARIABLE cCredentials AS CHARACTER    NO-UNDO 
        INITIAL "username:password".
            
    SET-SIZE(mCredentials) = LENGTH(cCredentials).
    PUT-STRING(mCredentials,1,LENGTH(cCredentials)) = cCredentials.
    cCredentials = BASE64-ENCODE(mCredentials).
        
    CREATE SOCKET hSocket.
        
    hSocket:CONNECT("-H some.webservice.com -S 443 -ssl").
    hSocket:SET-READ-RESPONSE-PROCEDURE('handleRestPostResponse',THIS-PROCEDURE).
        
    FIND FIRST ttRecord NO-LOCK NO-ERROR.
    IF NOT AVAILABLE ttRecord THEN LEAVE.

    TEMP-TABLE ttRecord:WRITE-JSON("LONGCHAR",lcData,FALSE,?,FALSE,TRUE).
                
    lcRequest  = "POST "                                               + 
                 "https://some.webservice.com/app/category/resource"   + 
                 " HTTP/1.0~r~n"                                       + 
                 "Authorization: Basic " + cCredentials + "~r~n"       + 
                 "Content-Type: application/json~r~n"                  + 
                 "Content-Length: " + STRING(LENGTH(lcData)) + "~r~n"  + 
                 "Host: some.webservice.com~r~n"                       + 
                 "Connection: Keep-Alive~r~n"                          + 
                 "~r~n" + lcData + "~r~n".
        
    SET-SIZE(mRequest)       = 0.
    SET-SIZE(mRequest)       = LENGTH(lcRequest) + 1.
    PUT-STRING(mRequest,1)   = lcRequest.
        
    hSocket:WRITE(mRequest,1,LENGTH(lcRequest)).
        
    REPEAT ON STOP UNDO, LEAVE ON QUIT UNDO, LEAVE:
        IF hSocket:CONNECTED() THEN 
            WAIT-FOR READ-RESPONSE OF hSocket.
        ELSE
            LEAVE. 
    END.

    FINALLY:
        hSocket:DISCONNECT() NO-ERROR.
        DELETE OBJECT hSocket NO-ERROR.
    END FINALLY.
END PROCEDURE.
    
PROCEDURE handleRestPostResponse:
    DEFINE VARIABLE lcData      AS LONGCHAR    NO-UNDO.
        
    DEFINE VARIABLE mResponse AS MEMPTR      NO-UNDO.
    
    lcData = "".
    
    /* Good practice to ensure max data on the stream */
    PAUSE 2 NO-MESSAGE.
    
    DO WHILE SELF:GET-BYTES-AVAILABLE() GT 0:
        SET-SIZE(mResponse) = SELF:GET-BYTES-AVAILABLE() + 1.
        SELF:READ(mResponse,1,1,SELF:GET-BYTES-AVAILABLE()) NO-ERROR.
        
        lcData = lcData + GET-STRING(mResponse,1).   
    END.

    FINALLY:
        /* This causes the next iteration of the REPEAT with the 
           WAIT-FOR READ-RESPONSE to fail and bounce out of the loop */
        SELF:DISCONNECT() NO-ERROR.
    END FINALLY.
END PROCEDURE.
Workaround
Notes
Keyword Phrase
Last Modified Date9/6/2017 9:03 PM

Powered by