Este artigo é uma tradução do artigo: http://blog.marcocantu.com/blog/2018-december-new-radserver-103.html
A versão do RAD Server que acompanha o RAD Studio 10.3 oferece um conjunto muito significativo de aprimoramentos, com uma nova lógica de mapeamento de URL e novos componentes do lado do servidor.
A versão do RAD Server que acompanha o RAD Studio 10.3 oferece um conjunto muito significativo de aprimoramentos, principalmente focado em como um recurso (e ter uma URL) é mapeado para classes e métodos no servidor. Embora a ideia principal de ter classes (ou módulos de dados) que implementam recursos permaneça a mesma, há duas novas abordagens:
- Primeiro, você pode mapear a mesma URL e o HTTP Verb para vários manipuladores de método, com base no tipo de conteúdo e nos cabeçalhos HTTP de tipos aceitos. Como uma mudança lateral, você também pode mapear livremente verbos HTTP para nomes de métodos personalizados.
- Segundo, em vez de implementar os métodos reais para os verbos HTTP na classe de recursos, eles podem ser encaminhados para uma classe de implementação separada e possivelmente compartilhada, que precisa suportar uma interface específica. Para simplificar ainda mais as coisas, o RAD Studio inclui componentes prontos para uso para gerenciamento de arquivos e conjuntos de dados
Usando vários tipos de aceitação com EndpointProduce
Um dos novos recursos que mencionei acima é a capacidade de mapear a mesma URL exata para métodos diferentes, dependendo de alguns cabeçalhos HTTP. Para uma operação GET, você pode discriminar o tipo de conteúdo indicado no cabeçalho Aceitar HTTP. Você faz isso decorando os métodos com o atributo EndpointProduce mais um tipo MIME relacionado.
Este é o exemplo de uma classe que aceita imagens ou dados gerais (para o Chrome, pelo menos a aplicação / xml está em qualquer chamada geral):
type [ResourceName('content')] TContentResource1 = class(TDataModule) published [ResourceSuffix ('*')] [EndpointProduce ('image/jpeg')] procedure GetImage(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); [ResourceSuffix ('*')] [EndpointProduce ('application/xml')] procedure GetText(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); end;
A implementação desses métodos é bastante trivial, pois todo o código é retornar um arquivo:
procedure TContentResource1.GetImage(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); var fs: TFileStream; begin fs := TFileStream.Create('c:\temp\content.jpeg', fmOpenRead); AResponse.Body.SetStream(fs, 'image/jpeg', True); end;
Como você pode testá-lo? Certamente não apenas apontando o seu navegador para o URL? se você receber invariavelmente o resultado do segundo método, mas também poderá receber uma mensagem de erro indicando que nenhum dos pontos de extremidade disponíveis corresponde à solicitação. Para um teste simples, eu escrevi o seguinte código HTML, que se refere ao mesmo URL de duas maneiras diferentes que o navegador resolve com diferentes cabeçalhos Aceitar na solicitação:
<html> <head> <title>a page for rad server</title> </head> <body> <h1>a page</h1> an image below <img src="/content/test.jpeg"></pre> <h1>some more</h1> <iframe src="/content/test.txt"> </body> </html>
Observe que você também pode servir isso do RAD Server configurando-o na seção — do arquivo INI (consulte o documento ou esta postagem do blog ).
Agora, a saída da página é semelhante à seguinte, com as duas solicitações sendo manipuladas por métodos diferentes:
Você pode ver o que acontece habilitando, por exemplo, o suporte do Dev Tools no Chrome e olhando para os cabeçalhos da segunda solicitação (a fonte test.txt no quadro):
Usando o componente EMSFileResource
A nova capacidade de delegar a implementação de recursos é melhor demonstrada usando os novos componentes introduzidos em 10.3. Usar o componente TEMSFileResource é uma maneira mais fácil de retornar arquivos em comparação com a implementação acima e, na verdade, permite ler e atualizar os arquivos com literalmente sem código.
Adicionar o componente a um módulo de dados (ou criá-lo no código) é bastante direto, já que as únicas propriedades necessárias são as ações permitidas (quais métodos HTML podem ser executados) e a pasta. Observe que, mais que uma pasta, você precisa de um modelo mapeado para a URL, portanto, qualquer parâmetro de URL adicional é interpretado como o nome do arquivo.
object EMSFileResource1: TEMSFileResource AllowedActions = [List, Get] PathTemplate = 'c:\temp\{id}' end
Em termos de declaração de classe de módulo de dados, tudo que você precisa é mapear as operações (listar e obter, neste caso) para o componente):
type [ResourceName('files')] TFilesResource1 = class(TDataModule) [ResourceSuffix('list', '/')] [ResourceSuffix('get', '/{id}')] EMSFileResource1: TEMSFileResource; published end;
Isso é tudo o que você precisa para poder retornar um array JSON com a lista de arquivos e acessar qualquer um desses arquivos. Esta é a lista de arquivos no formato JSON em um navegador:
Usando o componente EMSDataSetResource
Se acessar arquivos é legal e pode ser útil em alguns aplicativos, o outro novo componente para aplicações RAD Server adicionado em 10.3, EMSDataSetResource, é o que pode realmente economizar muito trabalho para muitos serviços web – dado a maioria dos os serviços acabam acessando bancos de dados. A maneira mais simples de ver esse componente em ação é colocar em um módulo de dados uma conexão de banco de dados (neste caso com uma conexão SQL Lite a um banco de dados de amostra fornecido com o RAD Studio), uma consulta simples e um componente EMSDataSetResource conectado com o inquerir.
Novamente, os componentes precisam ter configurações adequadas em AllowedActions. Além disso, os componentes têm várias opções de recursos que você deseja ativar, como paginação e classificação, e maneiras de indicar manualmente o campo-chave e como corresponder a uma única solicitação de registro. Para paginação, defino um tamanho de página menor para a demonstração, pois isso facilita a visualização em ação:
object TCustomerResource1: TTCustomerResource1 object EmployeeConnection: TFDConnection Params.Strings = ( 'ConnectionDef=SQLite_Demo') Connected = True LoginPrompt = False end object CustomerTable: TFDQuery Connection = EmployeeConnection SQL.Strings = ( 'SELECT * FROM CUSTOMERS' 'ORDER BY {IIF(!SORT, !SORT, CustomerID)}') end object CustomerResource: TEMSDataSetResource AllowedActions = [List, Get, Post, Put, Delete] DataSet = CustomerTable PageSize = 10 end end
Agora a implementação deste recurso RAD Server, que permite ler páginas de dados, ler registros individuais, atualizar e criar novos registros, não possui código real (a exclusão não funciona realmente porque existem outras tabelas com chaves estrangeiras para a tabela em questão ):
type [ResourceName('TCustomer')] TTCustomerResource1 = class(TDataModule) EmployeeConnection: TFDConnection; CustomerTable: TFDQuery; [ResourceSuffix('list', '/')] [ResourceSuffix('get', '/{CustomerID}')] [ResourceSuffix('put', '/{CustomerID}')] [ResourceSuffix('post', '/')] [ResourceSuffix('delete', '/{CustomerID}')] CustomerResource: TEMSDataSetResource; FDQuery1: TFDQuery; end;
Aqui estão duas imagens de navegador com uma página de dados e um registro individual:
O componente EMSDataSetResource tem muitas mais funcionalidades do que este post e o demo (de novo, acessível no GitHub ) mostra, mas isso deve fornecê-lo com um bom ponto de partida para explorar o que há de novo para desenvolvimento RAD Server no RAD Studio 10.3.
Querendo melhorar seu desenvolvimento, otimizar o seu tempo e de ter a possibilidade de atender melhor os seus clientes?
Com o treinamento RestFul DataSnap você irá desenvolver um servidor de aplicação RestFul com Datasnap e utilizar todos os seus benefícios que irá facilitar muito a sua vida, quando seu cliente disser “preciso dos meus dados na web hoje mesmo” você estará preparado para entregar uma solução robusta e eficaz.Nesse treinamento você irá aprender de forma prática a criar as principais rotinas de CRUD e Segurança para servidores RestFul Datasnap que podem ser consumidos de qualquer aplicação front-end.
No treinamento eu desenvolvi um método que alinha exemplos reais de aplicação das técnicas para resolver problemas do dia a dia.