Energize as suas aplicações Web com a classe OutgoingMessage

No mundo digital de hoje, uma experiência de utilizador suave e intuitiva é a chave para o sucesso de qualquer aplicação Web. Uma parte essencial desta experiência é proporcionar aos utilizadores um acesso fácil a vários recursos, quer sejam documentos, imagens ou outros tipos de dados. Para tornar isso possível, seu servidor deve gerenciar e entregar diferentes formatos de conteúdo eficientemente.

Com a nova funcionalidade do servidor REST de 4D, gerenciar a entrega de conteúdo diverso é agora mais fácil do que nunca. Anteriormente, o servidor REST só podia retornar dados escalares, de entidades ou de seleção de entidades. Agora, pode entregar conteúdo web completo diretamente – conteúdo pronto para ser manuseado por um navegador.

O download de arquivos ou o recebimento de dados binários do servidor REST agora é simples, graças à nova classe OutgoingMessage. Com ela, é possível personalizar facilmente as respostas para atender às suas necessidades.

Continue a ler para explorar como a classe OutgoingMessage pode melhorar a sua aplicação!

 

 

HDI_OutGoingMessageClass

 

Chamando uma função exposta no servidor REST

Lembrete rápido: As funções do modelo de dados ORDA e as funções singleton podem ser chamadas como APIs REST. Para refrescar a sua memória, consulte esta publicação do blog e esta.

Até agora, o servidor REST podia retornar vários tipos de resultados – escalares, entidades ou seleções de entidades – embrulhados em um objeto usando a propriedade result.

exemplo

Esta é a função getSomeInfo() na classe Datastore.

 

exposed Function getSomeInfo() : Text
	return "This is the info"

E aqui está o resultado obtido quando é chamada com o pedido /rest/$catalog/getSomeInfo:

 

{
    "result": "This is the info"
}

Comandos 4D Web não podem ser usados em tais funções, por isso a nova classe OutgoingMessage vem com um grande benefício.

 

A nova classe OutgoingMessage

O modelo de dados ORDA e as funções singletons podem agora retornar uma instância de objeto dessa nova OutgoingMessage classe.

Estes objetos são tratados diretamente por qualquer navegador como conteúdo Web.

Assim, pode propor aos seus utilizadores finais funcionalidades como o descarregamento de arquivos e imagens e a recepção de qualquer tipo de conteúdo através de um navegador.

Esta é a representação JSON de uma instância de objeto da classe OutgoingMessage.

 

 

exemplo

 

Neste exemplo, a função getFile() é implementada na classe Datastore. O objetivo é devolver o arquivo testFile.pdf como resposta ao pedido.

É criada uma instância de objeto da classe OutgoingMessage.

O corpo contém o conteúdo binário do ficheiro testFile.pdf e um cabeçalho que indica que o tipo de conteúdo está definido.

exposed onHTTPGet Function getFile() : 4D.OutgoingMessage
	
var $result:=4D.OutgoingMessage.new()
var $file:=File("/RESOURCES/testFile.pdf")
	
$result.setBody($file.getContent())  // Este é um contexto binário
$result.setHeader("Content-Type"; "application/pdf")
return $result

 

A classe OutgoingMessage contém três propriedades a preencher de acordo com as suas necessidades:

 

    • header: Define qualquer cabeçalho HTTP que o cliente esteja obrigado a tratar(por exemplo, content-type para indicar o tipo de conteúdo do corpo)

 

    • body: define o conteúdo que pretende enviar como resposta ao pedido. Pode ser uma String ou um Blob(por exemplo, arquivo, documento ou imagem como conteúdo binário).

 

    • status: Define qualquer código de estado HTTP de acordo com o resultado do pedido efectuado. Isso fornece ao cliente informações sobre a forma como o pedido decorreu (por exemplo, o estado 403 se o pedido for recusado). O valor predefinido é 200.

 

 

 

N.B. As propriedades body e status podem ser afetadas com o operador := ou com o correspondente setBody() / setStatus() correspondente.

 

facilitar a chamada de funções no servidor de repouso

 

a nova palavra-chave onHTTPGet para as funções

 

Até agora, as chamadas de funções (das classes do modelo de dados ORDA e dos singletons) através do servidor REST tinham de ser efetuadas com um verbo POST. Isto foi feito por razões de segurança para evitar a execução de código sensível através de uma ação tão simples como clicar numa ligação.

Uma vez que o POST nem sempre se adequa à experiência de usuário que se pretende oferecer, essas funções também podem ser chamadas com um verbo GET , ou seja, podem ser chamadas através da introdução de um URL num browser.

Utilize a palavra-chave new onHTTPGet para isso. Se esta palavra-chave for aplicada a uma função, esta função também pode ser chamada com um verbo GET!

 

exemplo

exposed onHTTPGet Function getSomeInfo() : 4D.OutgoingMessage

 

N.B. Como este tipo de chamada é uma ação facilmente oferecida, o programador deve garantir que nenhuma ação sensível é feita em tais funções.

 

passagem de parâmetros

Os parâmetros podem ser passados para a função com o parâmetro $params (deve estar dentro de uma coleção).

 

exemplo

Neste exemplo, é chamada a função getThumbnail() da classe de dados Products (para obter uma fotografia em miniatura de um determinado produto).

Recebe o nome do produto e a largura + comprimento necessários.

IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'

Consulte a documentação para obter mais informações sobre o envio de parâmetros ao chamar uma função.

 

Um exemplo completo

Eis o caso de utilização deste exemplo: é proposta uma chamada a um usuário final para descarregar o manual do utilizador de um produto selecionado com vários formatos disponíveis.

 

O pedido por detrás da ligação é: IP:port/rest/Products/getUserManual?$params='[1, “pdf”]’

 

O ID do produto selecionado (1) é passado como parâmetro e o formato requerido (pdf).

 

A função getUserManual() da classe de dados Products é chamada. Recebe o ID do produto e o formato como parâmetro.

 

O documento correspondente é recuperado. O seu conteúdo binário é colocado como um corpo na resposta com o tipo de conteúdo correspondente.

 

exposed onHTTPGet Function getUserManual($productId : Integer; $type : Text) : 4D.OutgoingMessage
	
var $file : 4D.File
var $response:=4D.OutgoingMessage.new()
var $doc:="/RESOURCES/User manuals/product_"+String($productId)

Case of 
	: ($type="pdf")
		$file:=File($doc+".pdf")
                $response.setBody($file.getContent()) // This is binary content 
		$response.setHeader("Content-Type"; "application/pdf")
			
	: ($type="jpeg")
		$file:=File($doc+".jpeg")
                $response.setBody($file.getContent()) // Este é um contexto binário 
		$response.setHeader("Content-Type"; "image/jpeg")
End case 
	
return $response

 

 

 

Aqui está o cenário reproduzido num browser:

 

blank

 

 

 

Experimente você mesmo

 

Faça o download do HDI para explorar esse novo recurso e confira a documentação para obter mais detalhes sobre como usar a classe OutgoingMessage nas suas aplicações Web.

Avatar
• Proprietário do produto - Marie-Sophie Landrieu -Yvert entrou ao time 4D Product como Proprietária do Produto em 2017. Como tal, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Marie-sophie se formou na Escola de Engenharia de ESIGELEC e começou sua carreira como engenheira da IBM em 1995. Participou em vários projetos (de manutenção e criação) e trabalhou como desenvolvedora de Cobol. Depois trabalhou como designer de UML e desenvolvedora de Java. Suas principais funções foram analisar e redigir requisitos funcionais, coordenar os times de negócio e de desenvolvimento.