Skip to main content
Skip table of contents

TbeCbHTTPAsync

TbeCbHTTPAsync

Eine Komponente zur Kommunikation über HTTP Verbindungen (ähnlich wie TbeCbHTTP und TbeCbbengHTTP). Die Kommunikation (Senden und Empfangen) erfolgt dabei asynchron wodurch die Oberfläche nicht blockiert wird.
Hinweis: Es können immer 3 Anfragen pro TbeCbHTTPAsync Instanz parallel verarbeitet werden. Zu viel gleichzeitige TbeCbHTTPAsync Instanzen können sich je nach Hardware negativ auf die Systemleistung auswirken.

Funktionen und Methoden

Funktionen und Methoden

Beschreibung

CbClearRequests()

Alle in der Warteschlange befindlichen (und noch nicht gestartete) Requests löschen.

CbRequest(cURL:C, nMode:N, oSettings:O, cBody:C, uProgId:U):C

Asynchronen HTTP Request erstellen und zur Warteschlange hinzufügen

Rückgabe: eine Eindeutige GUID über die der Request dann in den Events nach Ausführung eindeutig zugeordnet werden kann

  • Parameter:

    • cURL: URL an die der Request gestellt werden soll (bei be-Portal Anfragen reicht hier Query Teil, also der Teil nach dem /)

    • nMode: siehe TbeHTTPRequestMode

    • oSettings: siehe TBeCbHTTPAsyncRequestSettings bzw. TBeCbHTTPAsyncRequestPortalSettings

    • cBody: Inhalt der verschickt werden soll

    • uProgId: neben der Rückgabe eine Möglichkeit um einen eindeutigen Kenner zu übermitteln mit dem der Request nach Ausführung wieder zugeordnet werden kann.

Verfügbare Ereignisse

Ereignis

Beschreibung

 CbOnAsyncResponse

Ereignis wenn der Request erfolgreich verarbeitet wurde.

Achtung: innerhalb des Ereignis muss im Codeblock das oResponse Objekt vom Codeblock mit DestroyObject zerstört werden, andernfalls kann es zu Memory-Leaks kommen

Signatur: function(cGUID:C, cUrl:C, nMode:N, uProgId:U, oResponse: TBeCbHTTPAsyncResponse)

  • Parameter:

    • cGUID: entspricht der Rückgabe von CbRequest()

    • cURL: entspricht der cURL von CbRequest()

    • nMode: entspricht nMode von CbRequest()

    • uProgId: entspricht uProgId von CbRequest()

    • oResponse: Objekt mit allen Werten der Rückgabe, siehe TBeCbHTTPAsyncResponse

 CbOnAsyncFailed

Identisch zu CbOnAsyncResponse; wird ausgelöst wenn der Request nicht erfolgreich verarbeitet werden konnte.

Achtung: innerhalb des Ereignis muss im Codeblock das oResponse Objekt vom Codeblock mit DestroyObject zerstört werden, andernfalls kann es zu Memory-Leaks kommen

Beispiel

z.B. zur Verwendung in einem Calc-Edit auf einer be Maske

CODE
| cRes, oHTTP, cLastRequest:C:='', nLastMasterId:N:=-1, oSettings:O, oCalcEdit0:O, oCalcEdit1:O, oCalcEdit2:O, oCalcEdit3:O |

SetPersistent(true),

//******************************************************************************
function FindEdit(cName:C)
   | oOwner |
   oOwner := GetOwner(Self),
   Result := FindObject(oOwner, cName + '_' + right(Self.Name, 9)),
end,

//******************************************************************************
// Event wenn der Asynchrone Aufruft erfolgreich abgearbeitet wurde
// @Result: null
//******************************************************************************
function CbAsyncResponse(cGUID:C, cURL:C, nMode:N, oProgId:U, oResponse:O) // TBeCbHTTPAsyncResponse
   | oJSON |

   startseq
      if (cGUID == cLastRequest) and (oProgId = Self) then
         if oResponse.ContentType == 'application/json' then
            oJSON := CreateObject('TbeCBAnything'),
            startseq
               oJSON.FromString(oResponse.Body),
               oCalcEdit0.Text := oResponse.ID,
               // oCalcEdit0.Text := ArrToStr(oResponse.Headers) + crlf + oResponse.Body,
               oCalcEdit1.Text := oJSON.getString('name'),
               oCalcEdit2.Text := oJSON.getString('email'),
               oCalcEdit3.Text := oJSON.getString('body'),
            always
               DestroyObject(oJSON),
            stopseq,
         endif,
      endif,
   always
      // Das Response Objekt MUSS am Ende vom Codeblock zerstört werden!
      DestroyObject(oResponse),
   stopseq,
end,

//******************************************************************************
// Event wenn der Asynchrone Aufruft fehlgeschlagen ist
//******************************************************************************
function CbAsyncFailed(cGUID:C, cURL:C, nMode:N, oProgId:U, oResponse:O) // TBeCbHTTPAsyncResponse
   |oJSON |
   startseq
      if cGUID == cLastRequest then
         oCalcEdit0.Text := Str(oResponse.StatusCode) + ' - ' + oResponse.Body,

         if oResponse.StatusCode = 404 then
            oCalcEdit1.Text := 'k.A.',
            oCalcEdit2.Text := 'k.A.',
            oCalcEdit3.Text := 'k.A.',
         else
            oCalcEdit1.Text := '! FEHLER !',
            oCalcEdit2.Text := '! FEHLER !',
            oCalcEdit3.Text := '! FEHLER !',
         endif,
      endif,
   always
      // Das Response Objekt MUSS am Ende vom Codeblock zerstört werden!
      DestroyObject(oResponse),
   stopseq,
end,

//******************************************************************************
// Neuen Asynchronen Request ausführen
//******************************************************************************
function MakeRequest(cUrl:C)
   // oHTTP.CbClearRequests()
   cLastRequest := oHTTP.CbRequest(cUrl, rmGet, oSettings, '', Self),
   oCalcEdit0.Text := cLastRequest,
end,

//******************************************************************************
//
//******************************************************************************
function FindEdits()
   if Empty(oCalcEdit1) then
      oCalcEdit1 := FindEdit('TBeCalcEdit8'),
      oCalcEdit1.Text := '',
   endif,

   if Empty(oCalcEdit2) then
      oCalcEdit2 := FindEdit('TBeCalcEdit9'),
      oCalcEdit2.Text := '',
   endif,

   if Empty(oCalcEdit3) then
      oCalcEdit3 := FindEdit('TBeCalcEdit10'),
      oCalcEdit3.Text := '',
   endif,

   if Empty(oCalcEdit0) then
      oCalcEdit0 := Self,
      oCalcEdit0.Text := '',
   endif,
end,

//******************************************************************************
//
//******************************************************************************
function Init()
| aHeaders:A |
   FindEdits(),

   oHTTP := CreateObject("TbeCbHTTPAsync", , Self, nil, true),
   AssignEvent(oHTTP, 'CbOnAsyncResponse', 'CbAsyncResponse'),
   AssignEvent(oHTTP, 'CbOnAsyncFailed', 'CbAsyncFailed'),

   oSettings := CreateObject("TBeCbHTTPAsyncRequestSettings", "RequestSettings", oHTTP, nil, true),
   oSettings.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
   oSettings.Timeout   := 1000, // MSek. 0 = unendlich
   oSettings.VerifySSL := true,

   AAdd(aHeaders, {"X-HEADER-TEST", "Test Value"}),
   AAdd(aHeaders, {"X-HEADER-TEST-ABC", "Test Value ABC"}),
   oSettings.Headers := aHeaders,
end,


if ClassOf(GetOwner(Self), 'TBeMaskDesigner') then
   cRes := 'Designer',
else
   if Empty(oHTTP) then
      Init(),
   endif,
   cRes := '',
   if nLastMasterId <> DAB010:ID then
      nLastMasterId := DAB010:ID,
      oCalcEdit1.Text := 'loading ...',
      oCalcEdit2.Text := 'loading ...',
      oCalcEdit3.Text := 'loading ...',

      cRes := MakeRequest("https://jsonplaceholder.typicode.com/comments/" + Str(nLastMasterId)),
   endif,
endif,

cRes
JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.