Třídy HTTP: Nový způsob provádění asynchronních požadavků HTTP

Automaticky přeloženo z Deepl

V rámci naší neustálé snahy o zlepšování syntaxe a funkcí systému 4D jsme se rozhodli přinést nové příkazy pro provádění požadavků HTTP v systému 4D: třídy HTTP. Jsou k dispozici hned v 4D v19 R6 a v průběhu následujících verzí budou obsahovat mnoho vylepšení. Dovolte mi, abych vám hned ukázal, jak je používat.

HDI Nové třídy HTTP v akci

Jednoduchý požadavek

Základní syntaxe pro odeslání požadavku HTTP je velmi jednoduchá:

$request:=4D.HTTPRequest.new($url).wait()
If ($request.response#Null)
	// The code to handle the request response.
Else
	// The code to handle errors.
End if

Volání 4D.HTTPRequest.new jednak vytvoří instanci požadavku, jednak jej odešle. Výsledek požadavku bude získán uvnitř atributu response HTTPRequest.
V této fázi vás všechny zajímá, co tam to volání wait dělá. Nové třídy HTTP jsou určeny k asynchronnímu použití. Nemusíte vytvářet zvláštní proces, který by hostil váš požadavek; nyní můžete poslat požadavek uprostřed metody, aniž byste ji zablokovali. Pokud však chcete zachovat staré synchronní chování, můžete zavolat wait, abyste počkali na dokončení požadavku.

Asynchronní požadavek

Nyní se podíváme, jak vytvořit skutečně asynchronní požadavek:

$request:=4D.HTTPRequest.new($url) 
// The code that will be executed while the request is not complete.

If ($request.terminated) // Is the request complete?
	If ($request.response#Null)
		// The code to handle the request response.
	Else
		// The code to handle errors.
	End if
End if

Tady je to jednoduché. Nyní můžete provádět svůj kód během odesílání požadavku, a tak těžit z optimálního výkonu.

asynchronní požadavek s zpětnými voláními

Poslední příklad bude o něco složitější. Nová syntaxe vám umožňuje zpracovávat požadavky prostřednictvím zpětných volání. Typicky napíšete novou třídu, která bude zpracovávat váš HTTPRequest:

Class constructor()

Function onResponse($request : 4D.HTTPRequest)
// The code to handle the request response.

Function onError($request : 4D.HTTPRequest)
// The code to handle errors.

A tuto třídu pak budete používat k automatickému zpracování požadavků:

$callbacks:=cs.myClassToHandleHTTPRequests.new()
$request:=4D.HTTPRequest.new($url; $callbacks)

Není třeba zpracovávat požadavek ve vaší metodě; výsledek požadavku bude zpracován díky zpětným voláním onResponse a onError, jakmile bude k dispozici odpověď. Pozor si musíte dát pouze na jednu věc: zpětná volání se volají ve stejném procesu jako vaše metoda. Pokud proces ukončíte před jejich voláním, přijdete o výsledek požadavku. Nezapomeňte na konci své metody zkontrolovat, zda byly všechny požadavky dokončeny.

Příklad:

Pro poslední příklad se podívejme na skutečnou situaci. Požádáme o rozhraní API Trivia REST a odešleme uživateli náhodnou otázku. Zde je třída pro zpracování požadavku:

Class constructor()

Function onResponse($request : 4D.HTTPRequest)
If ($request.response.status=200)
	ALERT("Question: "+String($request.response.body[0].question))
	ALERT("Answer: "+String($request.response.body[0].answer))
Else 
	This.onError($request)
End if 

Function onError($request : 4D.HTTPRequest)
ALERT("Error when loading the question")

A pak můžete odeslat svůj požadavek:

$callbacks:=cs.TriviaRequestClass.new()
$request:=4D.HTTPRequest.new("http://jservice.io/api/random"; $callbacks)

Přejeme vám příjemnou zábavu při odpovídání na náhodné triviální otázky!

Jak to dělám

Krásné počasí ve Francii dnes

Pro ilustraci této funkce uvádíme ukázkový příklad dotazování služby REST pro předpověď počasí. Uvidíte všechny tyto různé požadavky v akci, které vám poskytnou nejlepší předpověď počasí, pokud žijete ve Francii (nebo do ní plánujete cestovat).

Toto je první příspěvek na blogu o nových třídách HTTP, buďte si jisti, že je to jeden z dlouhé série, protože nové funkce HTTP budou brzy uvolněny!

Pokud máte nějaké připomínky, můžete se o ně jako obvykle podělit na oficiálním fóru 4D.

Nicolas Brachfogel
• Product Owner & Senior Developer • Nicolas Brachfogel nastoupil do 4D v roce 2017 jako senior vývojář (4D server a sítě). Jako Product Owner, který řídí vydání Apple Silicon, má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací a také zajišťuje, aby implementace funkcí vyhovovaly potřebám zákazníků. Nicolas, absolvent Institut Supérieur d'Informatique Appliquée (INSIA), začal svou kariéru jako softwarový vývojář v roce 2001. Po několika letech kódování v Javě a C++ se specializoval na vývoj klient-server pro společnosti zabývající se videohrami. Jako serverový vývojář/architekt úspěšně pracoval na serverových architekturách mnoha her (Dofus Arena, Drakerz, Trivial Pursuit Go!).