Header-Authentifizierung

  1. Der Funktionsbaustein wird gestartet, indem die Variable bHeaderAuth im Hauptprogramm auf TRUE gesetzt wird.
  2. Die steigende Flanke wird dann verwendet, um eine GET-Anfrage mit dem Funktionsbaustein IotHttpRequest zu senden. Diese Anfrage enthält ein zusätzliches Header-Feld für die Authentifizierung.
  3. Nachdem die Anfrage abgeschlossen ist, wird die Fehlerbehandlung durchlaufen. Wenn weder der Funktionsbaustein selbst noch der HTTP-Statuscode einen Fehler aufweisen, wird die JSON-Antwort vom Webserver geparst. Die JSON-Antwort enthält die Information, ob die Authentifizierung erfolgreich war.
FUNCTION_BLOCK FB_TestHTTP_HeaderAuth
VAR_INPUT
    bSend               : BOOL;
END_VAR
VAR_IN_OUT
    fbClient            : FB_IotHttpClient;
END_VAR
VAR_OUTPUT
    bBusy               : BOOL;
    bError              : BOOL;
END_VAR
VAR
    fbRequest           : FB_IotHttpRequest;
    fbHeader            : FB_IotHttpHeaderFieldMap;
    fbJson              : FB_JsonDomParser;
    nState              : UDINT;
    RisingEdge          : R_TRIG;
    
    bGetContentResult   : BOOL;
    sContent            : STRING(511);
    
    bGetJsonResult      : BOOL;
    jsonDoc             : SJsonValue;
    jsonVal             : SJsonValue;
    bResultValue        : BOOL;
    
    nReqCount           : UDINT;
    nResCount           : UDINT;
    nValidResCount      : UDINT;
    nErrCount           : UDINT;
    bOnce               : BOOL:= TRUE;
END_VAR
IF bOnce THEN
    fbHeader.AddField('Authorization', 'Basic cG9zdG1hbjpwYXNzd29yZA==', FALSE);
    bOnce:= FALSE;
END_IF

RisingEdge(CLK:= bSend);
CASE nState OF
0:
    IF RisingEdge.Q THEN
        IF fbRequest.SendRequest(sUri:= '/basic-auth', fbClient:= fbClient, 
                                 eRequestType:= ETcIotHttpRequestType.HTTP_GET, 0, 0, fbHeader) THEN
            nState:= 1;
            nReqCount:= nReqCount+1;
            bBusy:= TRUE;
            bError:= FALSE;
        END_IF
    END_IF
1:
    IF NOT fbRequest.bBusy THEN
        bError:= TRUE;
        IF NOT fbRequest.bError THEN
            bGetContentResult:= fbRequest.GetContent(pContent:= ADR(sContent),
                                                     nContentSize:= SIZEOF(sContent), 
                                                     bSetNullTermination:= TRUE);
            IF fbRequest.nStatusCode >= 200 AND fbRequest.nStatusCode < 300 THEN
                bGetJsonResult:= FALSE;
                jsonDoc:= fbRequest.GetJsonDomContent(fbJson);
                IF jsonDoc <>0 THEN
                    bGetJsonResult:= TRUE;
                    IF fbJson.HasMember(jsonDoc, 'authenticated') THEN
                        jsonVal:= fbJson.FindMember(jsonDoc, 'authenticated');
                        IF fbJson.IsBool(jsonVal) THEN
                            bResultValue:= fbJson.GetBool(jsonVal);
                            nValidResCount:= nValidResCount+1;
                            bError:= FALSE;
                        END_IF
                    END_IF
                END_IF
                nResCount:= nResCount+1;
            END_IF
        END_IF
        nState:= 0;
        bBusy:= FALSE;
        IF bError THEN
            nErrCount:= nErrCount+1;
        END_IF
    END_IF
END_CASE