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