Codice di esempio

Panoramica

L'esempio seguente mostra come inviare una richiesta Get HTTP mediante la proprietà State come variabile di stato della macchina di stato:

PROGRAM SR_HttpClient
VAR
     //FB instance
     fbHTTP : SE_HTTP.FB_HttpClient;
     //Application commands
     xCmdSendRequest : BOOL;
     xCmdReset : BOOL;
     //Input parameter of Connect method
     sServerIP : STRING[15] := '34.227.236.7';
     uiServerPort : UINT := 443;
     stTlsSettings : SE_HTTP.TCPUDP.ST_TlsSettingsClient;
     //Input parameter of Get method
     sResource : STRING[SE_HTTP.GPL.Gc_uiMaxLengthOfResource];
     sHost : STRING[SE_HTTP.GPL.Gc_uiMaxLengthOfHost] := 'se.com';
     sAdditionalHeader : STRING;
     sResponse : STRING[2000];
     //Response evaulation
     uiResponseCode : UINT;
     etStatusClass : SE_HTTP.ET_StatusClass;
     sHeader : STRING[1000];
     sContent : STRING[1000];
     uiHeaderBufferSize : UINT;
     uiContentBufferSize : UINT;
     //Local diagnostic variables
     xError : BOOL;
     etResult : SE_HTTP.ET_Result;
     sResultMsg : STRING;
END_VAR
VAR CONSTANT
     c_byNull: BYTE := 16#0;
END_VAR

CASE fbHTTP.State OF
  SE_HTTP.ET_State.Idle:
    //Trigger Send Request
    IF xCmdSendRequest THEN
        xCmdSendRequest := FALSE;
        fbHTTP.ConnectToServer( i_sServerIP:= sServerIP,
                                i_uiServerPort:= uiServerPort,
                                i_xUseTls:= TRUE,
                                i_stTlsSettings:= stTlsSettings,
                                q_xError=> xError,
                                q_etResult=> etResult,
                                q_sResultMsg=> sResultMsg);
    END_IF
SE_HTTP.ET_State.Connected:
     //Send HTTP method GET
       fbHTTP.Get( i_sResource:= sResource,
                   i_sHost:= sHost,
                   i_anyAdditionalHeader:= sAdditionalHeader,
                   i_anyResponseBuffer:= sResponse,
                   q_xError=> xError,
                   q_etResult=> etResult,
                   q_sResultMsg=> sResultMsg);
SE_HTTP.ET_State.ResponseAvailable:
     //Process response before acknowledge
     uiResponseCode := fbHTTP.StatusCode;
     etStatusClass := fbHTTP.StatusClass;
     //Extract header and content from response
     uiHeaderBufferSize := SIZEOF(sHeader);
     SysMem.SysMemCpy(pDest := ADR(sHeader), pSrc := (ADR(sResponse)),
     udiCount := MIN(fbHTTP.HeaderLength, uiHeaderBufferSize-1));
     sHeader [uiHeaderBufferSize] := c_byNull;

     uiContentBufferSize := SIZEOF(sContent);
     SysMem.SysMemCpy(pDest := ADR(sContent), pSrc := (ADR(sResponse)      +fbHTTP.ContentStartIndex), udiCount :=      MIN(fbHTTP.ContentLength,uiContentBufferSize-1));
     sContent [uiContentBufferSize] := c_byNull;

     //Acknowledge response and disconnect from server
     fbHTTP.AcknowledgeResponse(i_xStayConnected := FALSE);

SE_HTTP.ET_State.Error:
     //Trigger reset of detected error
     IF xCmdReset THEN
         xCmdReset := FALSE;
         fbHTTP.Reset();
     END_IF
END_CASE