Aulas HTTP: Uma Nova Forma de Realizar Pedidos HTTP Assíncronos

Tradução automática de Deepl

No nosso constante esforço para melhorar a sintaxe e as funcionalidades 4D, decidimos trazer-lhe novos comandos para executar pedidos HTTP em 4D: as classes HTTP. Estão disponíveis directamente em 4D v19 R6 e irão apresentar muitas melhorias em relação às próximas versões. Deixe-me mostrar-lhe como utilizá-los de imediato.

HDI Novas Classes HTTP em Acção

Pedido simples

A sintaxe básica para enviar um pedido HTTP é muito simples:

$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

A chamada para 4D.HTTPRequest.new instanta o pedido e envia-o. O resultado do pedido será recuperado dentro do atributo de resposta do HTTPRequest.
Nessa fase, todos se interrogam sobre o que esta chamada à espera está lá a fazer. As novas classes HTTP destinam-se a ser utilizadas de forma assíncrona. Não precisa de criar um processo específico para alojar o seu pedido; pode agora enviar um pedido no meio de um método sem o bloquear. Mas se quiser manter o antigo comportamento síncrono, pode fazer uma chamada para aguardar que o pedido seja concluído.

Pedido assíncrono

Agora, vamos ver como fazer um pedido genuinamente assíncrono:

$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

Aqui está, simples. Pode agora executar o seu código enquanto o seu pedido está a ser enviado e, como tal, beneficiar de óptimos desempenhos.

pedido assíncrono com chamadas de retorno

O último exemplo será um pouco mais complicado. A nova sintaxe permite tratar os pedidos através de chamadas de retorno. Tipicamente, escreverá uma nova classe para tratar do seu pedido 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.

E utilizará então esta classe para tratar automaticamente dos seus pedidos:

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

Não há necessidade de tratar o pedido no seu método; o resultado do pedido será tratado graças ao onResponse e onError callbacks assim que houver uma resposta disponível. Só tem de estar atento a uma coisa: as chamadas de retorno são chamadas no mesmo processo que o seu método. Irá perder o resultado do pedido se matar o processo antes de serem chamadas. Certifique-se no final do seu método para verificar se todos os seus pedidos foram concluídos.

Exemplo

Para o último exemplo, vejamos uma situação real. Iremos solicitar uma Trivia REST API e submeter uma pergunta aleatória ao utilizador. Aqui está a classe para tratar do pedido:

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

E depois pode enviar o seu pedido:

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

Divirta-se a responder a perguntas triviais aleatórias!

Como é que eu

Bonito tempo em França hoje

Para ilustrar esta característica, eis um exemplo de demonstração interrogando um serviço de previsão meteorológica REST. Verá todos estes diferentes pedidos em acção para lhe fornecer a melhor previsão meteorológica enquanto viver em (ou planear viajar para) França.

Este é o primeiro post no blog sobre as novas classes HTTP, tenha a certeza de que esta é uma de uma longa série, uma vez que as novas funcionalidades HTTP serão lançadas em breve!

Como habitualmente, se tiver algum comentário, sinta-se à vontade para o partilhar connosco no fórum oficial 4D.

Nicolas Brachfogel
• Proprietário do produto e Desenvolvedor Senior -Nicolas Brachfogel entrou a 4D em 2017 como Senior Developer (4D Server e Networking). Como Product Owner para gerenciar o lançamento de Apple Silicon, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais, além de garantir que as implementações de funcionalidade cumpram com as necessidades do cliente. Diplomado pelo Instituto Superior de Informática Aplicada (INSIA), Nicolas começou sua carreira como desenvolvedor de software em 2001. Depois de vários anos codificando em Java e C++, passou a especializar-se no desenvolvimento cliente-servidor para empresas de videogames. Como desenvolvedor/arquiteto de servidores, trabalhou com sucesso nas arquiteturas de servidores de muitos jogos (Dofus Arena, Drakerz, Trivial Pursuit Go!)