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
|
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)
|
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
| 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