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.