Anda di halaman 1dari 40

Criando Web Services de Alto Desempenho com

Delphi

Esta a sua cpia pessoal da apostila


Ol! com grande satisfao que lhe disponibilizamos esta apostila
sobre o tema Criando Web Services de Alto Desempenho com Delphi.
ATENO: Este material est sendo liberado de forma gratuita do jeito que esta. Perdoe as
eventuais lacunas Este material est licenciado sob os termos da CopyLeft

Por conta de um compromisso em poupar recursos e contribuir por um


mundo melhor no imprimiremos o material e acreditamos que em geral no
h necessidade de se fazer isto. Por isto esta uma cpia pessoal do material.
Esperamos que voc compartilhe este material com seus colegas.
Sugestes de melhoria sero sempre bem vindas!
Muito obrigado pelo prestgio de sua companhia.

Sobre esta apostila


Verso: 003 - Junho/2014
Revisor: Jos Mrio Silva Guedes

Sobre a arrayOF
A arrayOF Consultoria e Treinamento tem por filosofia desenvolver o
potencial de seus parceiros ensinando e aprendendo com eles.

1 de 40

Criando Web Services de Alto Desempenho com


Delphi

Sumrio
Esta a sua cpia pessoal da apostila ...................................................................... 1
Sobre esta apostila ........................................................................................................ 1
Sobre a arrayOF ............................................................................................................. 1
Material de apoio .......................................................................................................... 4
Introduo ...................................................................................................................... 4
Protocolo de Transporte X Protocolo de Comunicao ......................................... 6
TCP/IP Protocolo de Transporte ............................................................................. 6
HTTP Protocolo de Comunicao ........................................................................ 7
Momento mo na massa: Criando o seu prprio protocolo .............................. 7
SOA Arquitetura Orientada a Servio ...................................................................... 8
Provedor ...................................................................................................................... 8
Consumidor ................................................................................................................. 8
Comunicao ............................................................................................................ 9
ROA - Arquitetura Orientada a Recursos ................................................................... 9
Entendendo o HTTP para entender o REST ................................................................. 9
Web Humana X Web Programvel ....................................................................... 10
HTTP ............................................................................................................................. 10
REST ............................................................................................................................. 11
Estado Representacional .................................................................................... 11
Roy Fielding e Tim Berners-Lee ............................................................................ 12
Dissecando o protocolo HTTP sob o ponto de vista do REST ............................. 12
Regras gerais do protocolo HTTP ........................................................................ 13
Momento mo na massa........................................................................................ 18
Dominando o JSON ..................................................................................................... 19
Estrutura do JSON ................................................................................................. 19
Interagindo com o JSON pelo Delphi................................................................ 23
Momento mo na massa: Recuperando o aniversrio e as fotos dos seus
amigos do Facebook ........................................................................................... 24
Serializao de objetos ............................................................................................... 26
ORM Mapeamento Objeto Relacional ........................................................... 27
DataSnap ...................................................................................................................... 28
No que o DataSnap se apoia? .............................................................................. 29
Mas... .......................................................................................................................... 29
2 de 40

Criando Web Services de Alto Desempenho com


Delphi
Existe alternativas ao DataSnap? .......................................................................... 30
DataSnap TCP/IP X DataSnap REST ....................................................................... 30
Momento mo na massa: Nosso Ol Mundo em trs camadas! ................. 31
Componentes envolvidos em um servidor DataSnap ........................................ 32
Funcionamento geral de um servidor DataSnap/REST....................................... 33
Manipulando as requisies e respostas HTTP ..................................................... 33
DSServerClass e a Classe manipuladora de requisies HTTP ....................... 34
Contedo JSON .................................................................................................... 35
Hackeando a resposta de um servidor DataSnap/REST................................. 35
Manipulando a QueryString da URL................................................................... 36
Explorando algumas possibilidades ...................................................................... 36
Cache: Evitando armazenamento das informaes pelos browsers e
proxies..................................................................................................................... 36
Modularizao de um servidor DataSnap ............................................................... 38
Pool de Conexes com o Banco de Dados ............................................................ 39
Para aprender mais ..................................................................................................... 40
Livros recomendados .................................................................................................. 40

3 de 40

Criando Web Services de Alto Desempenho com


Delphi

Material de apoio
Todos os cdigos dos exemplos citados nesta apostila esto disponveis
no GitHub:
https://github.com/arrayOF/criando_web_services_alto_desempenho.git

Introduo
Existe uma grande mudana em curso: estamos saindo da era das
solues on premisse para as solues in cloud.
Esta mudana, que esta se acelerando cada vez mais, exige mudanas
drsticas na forma como encaramos o desenvolvimento de software.
Isto porque o usurio final quer a informao onde ele, o usurio, estiver.
A necessidade de se possuir um servidor dedicado esta fazendo tanto sentido
quanto a de um mainframe.
Ns, desenvolvedores, precisamos nos reposicionar.
Esta apostila trata deste assunto. Como ns, desenvolvedores Delphi,
podemos nos adaptar a esta nova realidade? Como tirar o melhor da
ferramenta e atender s demandas atuais?
Algo que se deve ter em mente que o Delphi no esta sozinho. Uma
grande soluo necessariamente envolve outras tecnologias. Ainda nesta
apostila conheceremos um pouco de:

Apache;
Python;
noSQL e mongoDB;

importante alinharmos as expectativas desde j em relao ao


assunto principal, o Delphi. Como ele se posiciona neste novo cenrio?
Obviamente temos o DataSnap como tecnologia oficial da
Embarcadero para solues multi camadas. Porm para entender o
funcionamento do DataSnap necessrio entender os conceitos que o
sustenta e este o objetivo primordial deste treinamento.

4 de 40

Criando Web Services de Alto Desempenho com


Delphi
Para isto vamos nos concentrar em quatro pilares de um framework
REST:

Protocolo de Comunicao HTTP;


Representao da Informao JSON;
Processamento concorrente e suas implicaes Thread;
Orientao Objeto e Metaprogramao com RTTI;

5 de 40

Criando Web Services de Alto Desempenho com


Delphi

Protocolo de Transporte X Protocolo de Comunicao


Antes de iniciarmos de fato faz diferena entender uma questo que
abstrata a muitos programadores (e tem que ser abstrato, pois j temos
preocupaes demais).
Vamos falar muito de HTTP durante o treinamento. E o TCP/IP?
O DataSnap aumenta ainda mais esta confuso ao oferecer dois
protocolos: TCP e HTTP. Mas na verdade um no anula o outro.

TCP/IP Protocolo de Transporte


No vamos nos aprofundar, pois foge ao escopo do treinamento. Mas
importante entender que o protocolo TCP/IP um protocolo de transporte
entre os equipamentos de uma rede padro Ethernet.
TCP
IP

Protocolo de Controle de Transmisso


Protocolo de Internet

Ento quando uma mensagem sai de um equipamento a outro este


protocolo que garante que a mensagem chegar ao seu destino, mesmo que
passe por dezenas de equipamentos e softwares como roteadores, switchs,
proxies e por ai vai.
um mecanismo fantstico e vale a pena estudar! A piada a seguir d
uma ideia do que estamos falando:
Computador 1: Ol, eu gostaria de ouvir uma piada TCP
Computador 2: Ol, voc gostaria de ouvir uma piada TCP?
Computador 1: Sim, eu gostaria de ouvir uma piada TCP
Computador 2: Ok, eu vou lhe contar uma piada TCP
Computador 1: Ok, eu irei ouvir uma piada TCP
Computador 2: Voc est pronto para ouvir uma piada TCP?
Computador 1: Sim, eu estou pronto para ouvir uma piada TCP
Computador 2: Ok, estou prestes a lhe enviar uma piada TCP. Ela ir
durar 10 segundos, tem dois caracteres, no possui um contexto,
termina com uma punchline.
Computador 1: Ok, estou pronto para receber a sua piada TCP que ir
durar 10 segundos, tem dois caracteres, no possui um contexto
explcito, e termina com uma punchline.
Computador 2: Desculpe, a sua conexo expirou. Ol, voc gostaria de
ouvir uma piada TCP?

http://www.dicas-l.com.br/arquivo/piada_tcp.php#.U-wWNfldWYA

6 de 40

Criando Web Services de Alto Desempenho com


Delphi

HTTP Protocolo de Comunicao


J o HTTP, assim como outros (FTP, SMTP e por ai vai) que o objeto
central dos nossos estudos um protocolo de comunicao entre softwares.
como se fosse uma lngua.
As informaes contidas em uma mensagem HTTP trafegam via TCP/IP
de uma mquina outra.
Quando os pacotes TCP/IP finalmente chegam ao software destinatrio,
a mensagem contida s far sentido para este software se estiver em uma
determinada estrutura no nosso caso HTTP.

Momento mo na massa: Criando o seu prprio protocolo


Esperamos que isso nunca acontea com voc, mas eventualmente
voc precisar fazer uma integrao com equipamentos de algum
fabricante: Balana, Telefonia, Mquina Fabril e por ai vai.
Isso poder ser via cabo serial ou via TCP/IP e para isso voc ter que
estudar o protocolo de comunicao do fabricante do equipamento.
Em teoria esses protocolos so mais rpidos que os disponveis, pois so
otimizados, no tendo informaes suprfluas.
Vamos ento desenvolver o nosso prprio protocolo, onde haver um
servidor aguardando conexes e ao receber uma mensagem, corretamente
formatada, devolver a hora atual da mquina onde ele est.

7 de 40

Criando Web Services de Alto Desempenho com


Delphi

SOA Arquitetura Orientada a Servio


Arquitetura Orientada a Servio uma abordagem extremamente
eficiente para a otimizao dos recursos de TI de uma empresa.
Isso porque ela promove a desvinculao entre o domnio do negcio
(essencialmente as regras de negcio) e modelos especficos como
linguagens de desenvolvimento, sistemas operacionais, sistema de banco de
dados e por ai vai.
Portanto a organizao consegue
tecnolgica sem fazer grandes rupturas.

acompanhar

evoluo

Vale ressaltar de que um modelo conceitual e, portanto esta


arquitetura no implica necessariamente na existncia de webservices, mas
nos dias atuais difcil imaginar outra forma de operacionalizar o SOA.
Basicamente temos dois papis bem definidos: o de Provedor e o de
Consumidor.

CONSUMIDOR

COMUNICAO

PROVEDOR

Figura 1 - Esquema macro Provedor/Cliente

Provedor
Estrutura que prov funcionalidades de domnio de negcios. No nosso
escopo um conjunto de softwares com acesso a um banco de dados. Neste
software estaro as regras de negcio.

Consumidor
Estrutura de software que promove a visualizao das informaes bem
como a interao com o usurio final. Apesar desta descrio possvel
tambm que um consumidor seja outro software provedor.

8 de 40

Criando Web Services de Alto Desempenho com


Delphi

Comunicao
Para duas partes distintas se comunicarem necessrio haver um meio
e um protocolo suportado por ambos. Aqui estamos falando de uma
comunicao TCP/IP utilizando o protocolo HTTP para o DataSnap\REST.

ROA - Arquitetura Orientada a Recursos


REST a base do ROA: Arquitetura Orientada a Recursos.
ROA um modo de resolver um problema em um servio web REST.
Continua existindo os mesmos elementos descritos na seo anterior (Provedor
e Consumidor), porm a abstrao diminui um pouco.
Aqui estamos colocando o REST em evidncia e a forma como ele
funciona fortemente aderente ao HTTP. E este funcionamento que
entenderemos a partir da prxima seo.

Entendendo o HTTP para entender o REST


O HTTP est fortemente presente em nosso dia a dia e interessante
perceber esta realidade. incrvel o fato de muitos no se darem conta
certamente por ser algo intangvel.
Mas o fato que o HTTP o protocolo que sustenta o planeta no que
tange ao compartilhamento de contedo. Em um mundo interconectado,
onde a informao est presente mesmo onde voc no a quer, o HTTP que
permite toda esta... Mgica!
As solues de software, ento, tem que acompanhar esta realidade e
h algum tempo conhecemos o SOA, sendo o SOAP sua implementao mais
difundida.
Porm nos ltimos anos o REST vem ganhando fora e seu aspecto mais
marcante o de justamente reaproveitar os conceitos do HTTP.
Um sistema complexo que funciona , invariavelmente, considerado
como evoludo a partir de um simples que funcionava - John Gall.
O objetivo desta seo, ento, o de desmistificar o HTTP mostrando
que no h mgica e sim simplicidade e eficincia. Com isto entenderemos o
REST e finalmente o DataSnap\REST.
9 de 40

Criando Web Services de Alto Desempenho com


Delphi

Web Humana X Web Programvel


Existem duas WEBs: a humana e a programvel.
A humana a que todos ns conhecemos: Um navegador, uma URL e
horas de distrao. J a WEB programvel foi feita para ser consumida por
softwares.

HTTP
O HTTP a sigla para Protocolo de Transferncia de Hipertexto.
Provavelmente disto voc j saiba. Mas vamos estudar cada uma destas
palavras e entender do que se trata.
A princpio pense no HTTP como um envelope. No envelope vo as
informaes necessrias para que o carteiro consiga entregar ao destinatrio,
certo? E dentro do envelope h um contedo.
Para chegar ao seu destino toda esta estrutura passa por uma rede.
Vamos encarar ento a rede e todo o seu aparato como o carteiro.

PROTOCOLO
Na informtica protocolo uma conveno, ou seja, um conjunto de
regras bem estabelecidas, que torna possvel a comunicao entre duas
partes. Existem diversos protocolos alm do HTTP como o FTP (transferncia de
arquivos), SMTP (envio de e-mail) e por ai vai. Cada um com um propsito
bem especfico e no existe um protocolo melhor que outro de um modo
geral. Em um grande sistema eles se complementam.

TRANSFERNCIA
Esta parte do significado do HTTP explicita o objetivo primrio deste
protocolo: a transferncia. Transferir fazer a movimentao da informao
de uma ponta outra, seja no mesmo dispositivo, passando por uma rede
local at chegar grande web.

HIPERTEXTO
Hipertexto basicamente um texto com referncias (os famosos links)
que nos levam a outros textos. O hiper vem do grego e significa sobre ou
alm. Grosso modo um texto que possui ligaes com outros textos e estes
com outros, o que nos possibilita saltar do ponto em que estamos
diretamente para um mais interessante.

10 de 40

Criando Web Services de Alto Desempenho com


Delphi
Obviamente isso j nos remete ao HTML que por sinal surgiu junto com o
HTTP. No toa HTML significa Linguagem de Marcao de Hipertexto.

REST
REST o acrnimo para Transferncia de Estado Representacional.
fortemente baseado no HTTP tirando proveito de seus aspectos para simplificar
o desenvolvimento de um servio web.
O REST no uma tecnologia por si s, mas uma tcnica, ou conjunto
de princpios, para o desenvolvimento de sistemas distribudos. , portanto,
uma arquitetura ou, em outras palavras, uma proposta de trabalho. Sendo
assim, temos que entender ao mximo a proposta do REST para conseguir
aplica-la na prtica.
O termo transferncia foi visto um pouco mais acima. Vamos falar
ento do estado representacional.
Estado Representacional

O estado representacional refere-se situao em que determinado


recurso se encontra.
Um consenso no REST que ele no guarda estado, dai vem o termo
recorrente stateless (sem estado). Ento cabe a cada ponta (cliente e servidor
basicamente) receber, modificar e repassar o estado do recurso. Logo, a
mensagem HTTP deve possuir todas as informaes necessrias sobre o recurso
que esta sendo trabalhado.
Os objetivos da arquitetura REST vo mais alm:

Aumentar a escalabilidade;
Diminuir a latncia;
Encapsulamento de sistemas legados;
Definio clara das responsabilidades do cliente e do servidor;
Evolvabilidade, que a capacidade de evoluir e se adaptar;

Da lista acima, dois termos so de suma importncia: escalabilidade e


latncia.
Escalabilidade a qualidade de permitir que se aumente a carga sem
comprometer o sistema. Em um sistema web isso crucial afinal no
desejamos reescrever os softwares quando percebermos que ele no est
suportando a carga, certo?

11 de 40

Criando Web Services de Alto Desempenho com


Delphi
Para trabalhar na web o sistema tem que ser desenhado para isso. E
no estamos falando de pgina web ou da aplicao mvel. Estamos falando
de back-end.
J a latncia, de modo geral, o tempo que leva para determinada
tarefa ser executada: A solicitao do cliente, o envio do pedido pela rede, a
recepo pelos servidores envolvidos (proxy, roteadores e por ai vai), o
processamento pelo end-point (com um eventual acesso ao banco de dados)
e todo o caminho de volta da resposta.
Muita coisa pode dar errada e comprometer o sistema. Temos que
sempre identificar e agir para diminuir a latncia. H problemas relacionados
infraestrutura de rede, porm h muita responsabilidade nossa relacionada
programao.
Roy Fielding e Tim Berners-Lee
H um elo muito importante entre o HTTP e o REST e o nome dele Roy
Fielding. Ele um dos principais autores da especificao do protocolo HTTP e
no satisfeito cunhou o termo REST em uma tese de doutorado no ano de
2000. Vale citar que ele um dos fundadores da Apache Foundation, empresa
responsvel por um dos principais web-servers da indstria.
J o Tim Berners-Lee tambm co-autor das especificaes HTTP e seu
principal objetivo foi a criao de um protocolo de transferncia de objetos
HTML. Ou seja, o HTTP e o HTML nasceram juntos.
Obviamente existem diversas outras mentes brilhantes envolvidas neste
processo.
Apesar de no ser uma leitura obrigatria vale a pena citar que as
especificaes do HTTP esto no RFC 2616 cujo link :
http://www.ietf.org/rfc/rfc2616.txt

Dissecando o protocolo HTTP sob o ponto de vista do REST


Nesta seo iremos nos aprofundar no HTTP. O HTTP muito amplo,
portanto focaremos nos aspectos que faro diferena no desenvolvimento de
uma aplicao REST.
O HTTP um protocolo orientado a documentos. O propsito primrio
o de justamente recuperarmos de um computador remoto um determinado
documento.

12 de 40

Criando Web Services de Alto Desempenho com


Delphi
Na web humana o formato de documento mais evidente o HTML, que
so documentos estruturados para a interpretao de um navegador web.
Com isso fica evidente outra caracterstica importante do HTTP que o
fato dele ser baseada no paradigma de requisio e reposta.
Regras gerais do protocolo HTTP

Uma mensagem HTTP possui trs partes distintas:

Cabealho HTTP
Quebra de linha indicando o fim cabealho HTTP
Contedo (opcional)

POST /mensagem HTTP/1.1


User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
Content-Type: application/json
Content-Length: 21

{nome: ol mundo}

Cabealho HTTP

O cabealho HTTP contm diversas informaes que sero usadas pelo


software receptor da mensagem. Com essas informaes sero tomadas as
melhores decises em relao ao contedo da mensagem. Lembre-se sempre
da analogia com um envelope.
Cada informao esta presente em uma linha em texto ASCII.
A primeira linha contm informaes especiais sobre a mensagem, mais
especificamente a ao e a identificao do contedo sendo trabalhado
bem como a verso do protocolo HTTP.
Em seguida vem o cabealho HTTP propriamente dito, que so pares de
chave e valor e contm diversas informaes sobre o contedo e sobre o
software que esta enviando a mensagem. O cabealho termina, ento, com
uma quebra de linha simples.
Requisio

No HTTP a ponta cliente faz uma requisio para a ponta servidora


utilizando o seguinte protocolo:

13 de 40

Criando Web Services de Alto Desempenho com


Delphi
GET /index.html HTTP/1.1
Host: www.exemplo.com.br

Na primeira linha temos:

O mtodo HTTP: GET


O caminho do recurso a ser trabalhado: /index.html
A verso do protocolo HTTP: HTTP/1.1
Quebra de linha

Da segunda linha em diante temos o cabealho HTTP. So pares de


chave e valor delimitados por dois pontos.
No exemplo temos apenas uma informao adicional que o host do
servidor em que o recurso est hospedado.
Resposta

Aps o processamento da solicitao a ponta servidora responde


ponta cliente utilizando o seguinte protocolo:
HTTP/1.1 200 OK
Server: Apache
Content-Length: 23

<html>Ol mundo!</html>

Na primeira linha temos:


A verso do protocolo HTTP: HTTP/1.1
O status da resposta: 200
Uma descrio do status da resposta: OK
Em seguida temos o cabealho HTTP. Chamo a ateno para o
content-length que encerra justamente o tamanho do contedo que esta
sendo trafegado. Este tamanho em bytes.
Aps o fim do cabealho (com a devida quebra de linha final) temos o
contedo. No exemplo temos um contedo HTML.
URL X URI

Comumente fica a dvida sobre as diferenas entre os termos URL e URI.


Qual usar?

14 de 40

Criando Web Services de Alto Desempenho com


Delphi

URI
URL
URN

Identificador Padro de Recurso


Localizador Padro de Recursos
Nome Padro de Recurso

No h uma diferena muito clara. De certa forma a confuso existe,


pois eventualmente ignoramos a existncia da URN, que identifica unicamente
um recurso independentemente da localizao. Um exemplo o ISBN de um
livro qualquer: urn:isbn:0451450523
A URL, de um modo geral, identifica um recurso disponvel em uma rede.
De um arquivo a uma impressora. Tem a seguinte notao:
[protocolo]://[servidor]:[porta]/[caminho]/[recurso]

J a URI uma definio mais abstrata: cadeia de caracteres


compacta usada para identificar ou denominar um recurso. Podendo ento
ser ou uma URL ou uma URN.
Finalmente, no contexto HTTP e REST, a utilizao do termo URL se mostra
to correto quanto URI aparecendo ambas na literatura.
Maiores informaes em:

http://pt.wikipedia.org/wiki/URN
http://pt.wikipedia.org/wiki/URL
http://pt.wikipedia.org/wiki/URI

Classes de Recurso e Recurso

Como percebemos, a informao que trafega entre as partes


interessadas denominada recurso.
Quando desenvolvemos uma soluo sob este paradigma, no
errado afirmar que estamos desenvolvendo orientado a recursos. Fazendo um
paralelo OOP, a Classe de Recursos equivale a uma Classe ao passo que um
Recurso equivale a uma Instncia. Exemplo:

Classe de Recursos

Recursos

Clientes

Empresa XYZ
Empresa ABC
15 de 40

Criando Web Services de Alto Desempenho com


Delphi
Recurso Ativado

A princpio o recurso representado por um arquivo fsico, como por


exemplo, empresa_xyz.json ou empresa_abc.json. Obviamente que na vida
real informaes deste tipo estaro em um banco de dados.
Mas isso no deixa de ser um recurso, sendo referido ento como um
Recurso Ativado, pois gerado a partir do processamento de informaes
dispersas.
Representao do Recurso

Um recurso, obviamente, deve ser representado de alguma forma. Para


uma imagem ou arquivo binrio no h dvidas. Mas como representar um
cliente, por exemplo?
Os formatos mais usuais so o XML, JSON e YAML sendo o JSON o mais
popular nos sistemas REST.
CSV
Joo da Silva;45;

INI
NOME=Joo da Silva
IDADE=45

XML
<xml>
<nome>Joo da Silva</nome>
<idade>45</idade>
</xml>

JSON
{
nome: Joo da Silva,
idade: 45
}

YAML - http://pt.wikipedia.org/wiki/YAML
- nome: Joo da Silva
Idade: 57

16 de 40

Criando Web Services de Alto Desempenho com


Delphi

HTML
<html>
<body>
<div class=nome>Joo da Silva</div>
<div class=idade>45</div>
</body>
</html>

Interface Uniforme

O mtodo HTTP, tambm chamado de verbo HTTP ou ao HTTP


um conjunto bem definido e limitado de palavras chaves que indicam a ao
que o sistema cliente deseja efetuar em relao ao recurso.
As aes mais relevantes em REST so:
Mtodo
GET
PUT
POST
DELETE

Ao
Recupera um determinado recurso ou lista de recursos
Atualiza um determinado recurso ou cria se inexistente
Cria um novo recurso
Elimina um determinado recurso

Comumente os mtodos HTTP so associados s operaes CRUD:


CRUD
Create
Read
Update
Delete

SQL
INSERT
SELECT
UPDATE
DELETE

HTTP
POST
GET
PUT
DELETE

Ao
Criar
Recuperar
Modificar ou Criar
Eliminar

Existe uma discusso frequente sobre a real diferena entre os verbos


PUT e POST. Um artigo interessante esta em:
http://gc.blog.br/2007/07/02/post-vs-put-quem-insere-e-quem-altera/
Essa discusso nasce quando fazemos a associao entre comandos
SQL e verbos HTTP o que natural no comeo.
Status HTTP

Na resposta HTTP provavelmente a informao mais relevante (antes do


contedo) o cdigo de status. Sempre buscamos o 200 OK, mas existem

17 de 40

Criando Web Services de Alto Desempenho com


Delphi
outros. No Apndice A descreve-se os mais interessantes e o contexto em
que eles aparecem.

Momento mo na massa
Uma necessidade recorrente de recuperarmos o valor do dlar para
registrarmos em nosso sistema. Afinal muitos clculos so feitos em cima deste
valor.
Obviamente que a soluo mais imediata que podemos desenvolver
uma tela de cadastro simples. Porm isto esta sujeito s falhas humanas:
esquecimento, erro de digitao e por ai vai.
Porque no, ento, recuperar este valor da Internet?
Um site que possui esta informao o Dolar Hoje:
http://dolarhoje.com/

18 de 40

Criando Web Services de Alto Desempenho com


Delphi

Dominando o JSON
O formato adotado pelos atuais webservices para representao de
informao o JSON.
JSON o acrnimo de JavaScript Object Notation. No toa tem este
nome, pois surgiu no mbito do JavaScript, linguagem majoritariamente
utilizada para criar front-ends web.
uma formatao leve para intercmbio de dados e uma tima
alternativa ao XML. Um novo formato que esta criando popularidade o
YAML, mas ficar de fora do escopo deste treinamento por ainda no ter
aplicabilidade imediata.
Mais a frente nesta apostila falaremos do mongoDB e a cultura noSQL,
ou como preferimos nos referir, no relacional. O mongoDB guarda as
informaes no formato JSON.
Mas afinal, o que caracteriza uma informao JSON?
Estrutura do JSON
As imagens a seguir foram retiradas do site oficial do JSON:
http://www.json.org/json-pt.html
JSON simples. Tendo isso em mente fica mais fcil absorver os
conceitos. Temos tendncia a complicar as coisas e quando nos deparamos
com algo simples estranhamos. Alguns detalhes ficam mais obscuros ainda
para ns, desenvolvedores Delphi, devido s particularidades das linguagens,
no caso Delphi e JavaScript.
JSON String

Uma string, assim como no Delphi, representa uma informao textual.


Porm, por ter vindo de outro contexto, um string JSON possui algumas
peculiaridades em sua formatao.
caracterizado por uma cadeia de caracteres encerrados por aspas
duplas. Porm devemos ficar atentos aos caracteres escapados como o \n
que representa uma quebra de linha.

19 de 40

Criando Web Services de Alto Desempenho com


Delphi
Exemplos de strings vlidos:

mrio.guedes
Fernanda\nJlio

JSON Number

Um nmero representado por uma cadeia de dgitos com o sinal


negativo no comeo quando for o caso. A parte decimal definida pela
presena do ponto.
Importante notar a ausncia das aspas duplas nas extremidades, o que
caracterizaria uma string.
Exemplos de nmeros vlidos:
0
-10
30.15

20 de 40

Criando Web Services de Alto Desempenho com


Delphi

JSON True

Para representar o valor booleano verdadeiro usamos a seguinte


notao:
true

Ou seja, a palavra true, com as letras em minsculo e sem aspas duplas


nas extremidades.
JSON False

Para representar o valor booleano falso usamos a seguinte notao:


false

Ou seja, a palavra false, com as letras em minsculo e sem aspas


duplas nas extremidades.
JSON Null

Para representar um valor nulo, ou seja, inexistente, usa-se a notao:


null

Ou seja, a palavra null com as letras em minsculo e sem aspas duplas


nas extremidades.

21 de 40

Criando Web Services de Alto Desempenho com


Delphi
JSON Array

Um array JSON uma lista desordenada de valores de qualquer tipo.

Um array caracterizado por vrios valores separados por vrgula, todos


eles encerrados por colchetes.
Exemplos de arrays vlidos:
[]
[mario.guedes, 36, true, false, null, [1, 2, 3]]

JSON Object

Um objeto JSON um conjunto desordenado de pares de chave e


valor.

Um objeto JSON caracterizado por um conjunto de pares de chave e


valor, cada par separado por uma vrgula do outro par e por fim todos os
pares encerrados por chaves.
Exemplos vlidos:
{}
{nome : mrio.guedes}
{nome : mrio.guedes , idade : 36, filhos : [julio,
fernanda]}

22 de 40

Criando Web Services de Alto Desempenho com


Delphi
Perceba que a chave, por si s, representado por uma string incluindo,
portanto, as aspas duplas nas extremidades. J o valor pode ser de qualquer
tipo, at mesmo outro JSON Object.
Interagindo com o JSON pelo Delphi
O Delphi possui classes nativas para interagir com o JSON. Assim como
no XML necessrio criar rotinas recursivas. No dia a dia no parecer uma
boa ideia por envolver muito cdigo, por isso, seguindo uma filosofia de
trabalho que privilegia a simplicidade, o ideal ser criar um esquema de
serializao e deserializao de objetos.
As classes para interagir com JSON esto na unit Data.DBXJSON seguindo
o esquema definido na Figura 2:

Figura 2 - Hierarquia das classes

23 de 40

Criando Web Services de Alto Desempenho com


Delphi
Momento mo na massa: Recuperando o aniversrio e as fotos dos seus
amigos do Facebook

Grandes servios web optam pelo JSON por vrios motivos:

Legibilidade;
Diminuio de trfego de rede;
o Aumento de vazo e consequentemente da escalabilidade
Aderncia s linguagens modernas JavaScript, Python e Ruby por
exemplo;

Um exemplo de um grande servio web o Facebook. Tem a parte


social que todos conhecem e a parte programtica, ou seja, uma rea em
que usamos uma API REST e fazemos uma integrao com o aplicativo.
Outros exemplos, para citar os mais conhecidos so: Twitter, Google e
seus servios, LinkedIN entre diversos outros.
Vamos explorar alguns aspectos relacionados nossa conta pessoal no
Facebook.
O objetivo deste exerccio no o de nos aprofundarmos na API do
Facebook, mas sim de captar o esprito da coisa, pois no fim o que
construiremos com o nosso aplicativo: uma API REST
Imaginemos ento um aplicativo que liste nossos amigos e nos d a
data de aniversrio.
Logado no Facebook vamos acessar esta URL:
https://developers.facebook.com/
Entre diversas ferramentas temos o Graph Explorer e este recurso que
iremos utilizar.

Figura 3 - Tela inicial da rea para desenvolvedores

24 de 40

Criando Web Services de Alto Desempenho com


Delphi
Este recurso no permite uma integrao total com Facebook mas j
o suficiente. Basicamente permite interagir com as informaes relacionadas
nossa conta pessoal.
Para isso precisamos de um TOKEN de acesso, que um cdigo
especial que nos identifica no sistema bem como os recursos que queremos ter
acesso. Este TOKEN tem validade de uma hora:

Figura 4 - Boto para a obteno do TOKEN

Para a gerao do TOKEN necessrio especificar os recursos com os


quais se deseja interagir.

Figura 5 - Especificando os recursos com os quais se deseja interagir

25 de 40

Criando Web Services de Alto Desempenho com


Delphi

Serializao de objetos

26 de 40

Criando Web Services de Alto Desempenho com


Delphi

ORM Mapeamento Objeto Relacional


O ORM uma tcnica de desenvolvimento muito importante na
construo de um software de alto desempenho.
Devemos deixar de encarar o banco relacional, seja ele o SQL Server,
Oracle ou o MariaDB, como um deus que tudo pode.

Precisa armazenar imagens? Joga no banco de dados!


Precisa armazenar os XMLs da NFe? Joga no banco de dados!
Precisa fazer comunicao inter-processos? Um programa grava e
outro l... no banco de dados!

Enfim: Banco de dados para armazenar dados. Delegar ao banco de


dados tarefas outras que no tem haver com dados um contra senso.
Por outro lado, devemos evitar ao mximo fixar as instrues SQL em
nosso sistema. O ideal tornar o processo o mais dinmico possvel. E utilizar
tcnicas de ORM nos trs esta flexibilidade.
Obviamente que uma escolha implica em renncias. E esta seo tenta
mensurar os ganhos e as perdas.

27 de 40

Criando Web Services de Alto Desempenho com


Delphi

DataSnap
O DataSnap a tecnologia padro do Delphi para a criao de
solues multicamada. H todo um histrico sobre esta tecnologia que no
vamos discutir nesta apostila.
Vamos simplesmente esquecer o passado, ao menos no que tange
proposta do treinamento e focar no momento atual.
A proposta do DataSnap, de uma maneira geral, o de publicar classes
e mtodos para uso remoto. A Figura 6 tenta ilustrar este conceito.

SERVIDOR DATASNAP
Servidor TCP
(Indy)

Cliente

TCP/IP
Cliente #2

Thread
#1

Thread
#2

Thread
#3

Cliente #3

Figura 6 - Esquematizao geral do funcionamento do DataSnap

Com isto estamos saindo do modelo cliente/servidor para o modelo


multi camadas.
Obviamente que esta afirmao embute na verdade um tremendo
desafio no que tange arquitetura da soluo. Antes tnhamos que
desenvolver, em linhas gerais, um nico software. Agora teremos que, ainda
em linhas gerais, desenvolver dois softwares o cliente e o servidor.

28 de 40

Criando Web Services de Alto Desempenho com


Delphi

No que o DataSnap se apoia?


O DataSnap um agregado de tecnologias que tem por objetivo
facilitar a construo de um sistema multicamada. No precisando se
preocupar com essas tecnologias voc se concentra rapidamente no motivo
de ser do seu sistema.
Utilizando o DataSnap estamos deixando um pouco de lado as
seguintes preocupaes:

Comunicao TCP/IP: Toda a complexidade de fazer dois softwares


conversarem entre si j esta resolvida. E isto no pouca coisa.

Meta-programao: O cliente enviar mensagens e o servidor


magicamente ir instanciar e executar o mtodo da classe
correspondente. Por serem dois softwares diferentes, rodando em
mquinas diferentes isso seria extremamente desafiador de se fazer por
conta prpria.

Mas...
Infelizmente o DataSnap bastante criticado por aqueles que o
compara com outras solues e h um post muito popular do Roberto
Schneiders que faz uma criteriosa anlise de desempenho e em vrios
aspectos.
Os grandes viles so a biblioteca Indy (comunicao TCP/IP) e o
dbExpress (acesso a banco de dados).
Isso ressalta o mantra da Ortogonalidade. Nunca devemos depender
100% de uma tecnologia. bvio que um nvel de dependncia inevitvel.
http://robertocschneiders.wordpress.com/2012/11/22/datasnap-analysisbased-on-speed-stability-tests/
http://robertocschneiders.wordpress.com/2013/01/09/datasnap-analysisbased-on-speed-stability-tests-part-2/
A Clube Delphi possui o post traduzido pelo prprio autor:
http://www.devmedia.com.br/colocando-um-servidor-datasnap-a-provarevista-clubedelphi-magazine-151/28228
Apesar disto o DataSnap uma tecnologia vivel e a arquitetura de
toda a soluo que ditar o sucesso ou no da empreitada.
29 de 40

Criando Web Services de Alto Desempenho com


Delphi

Existe alternativas ao DataSnap?


Sim e algumas bem conceituadas. No temos conhecimento prtico
nestas alternativas, mas talvez valha a pena analisa-las antes de efetivamente
iniciar um novo projeto:
Biblioteca
mORMt
Delphi On Rails
TMS RemoteDB
Brook framework

Link
http://synopse.info/fossil/wiki/Synopse+OpenSource
https://code.google.com/p/delphionrails/
http://www.tmssoftware.com/site/remotedb.asp
http://silvioprog.github.io/brookframework/

Mas repete-se o conselho: evite criar um vnculo extremo com o


framework adotado.
O propsito do nosso treinamento justamente o de apontar o
caminho para criar esta tal ortogonalidade, tornando assim a sua soluo
perene.

DataSnap TCP/IP X DataSnap REST


Como nosso foco o DataSnap vamos concentrar os esforos nele. A
primeira grande escolha que se deve fazer quanto ao protocolo de
comunicao. Hoje ns temos duas opes: TCP/IP e REST.
Mas o que significa esta escolha?
TCP/IP
Aderente apenas a clientes Delphi
Possibilidade de trabalhar RAD
Conexo persistente:
Maior velocidade
Menor escalabilidade

HTTP
Aderente a qualquer cliente HTTP
Potencialmente exige mais cdigo
Conexo no persistente:
Menor velocidade (?)
Maior escalabilidade

Nosso treinamento ir focar na comunicao HTTP apesar da


possibilidade de um nico servidor poder ter os dois modos de comunicao.
Esta escolha se deve s exigncias do mercado que pede maior
interoperabilidade. E este objetivo s pode ser alcanado com o HTTP: O
mundo fala em HTTP.
Com esta escolha, o sistema estar apto a atender qualquer cliente
HTTP:

Outros webservices;
30 de 40

Criando Web Services de Alto Desempenho com


Delphi

Softwares desenvolvidos em diversas linguagens rodando em qualquer


plataforma;
Aplicativos web, em especial o JavaScript;
Aplicativos mobile (que exigem uma arquitetura mais leve);

Momento mo na massa: Nosso Ol Mundo em trs camadas!


A fim de quebrarmos o gelo vamos desenvolver o nosso primeiro
exemplo sem maiores explicaes.

31 de 40

Criando Web Services de Alto Desempenho com


Delphi

Componentes envolvidos em um servidor DataSnap


TDSServer: Componente que efetivamente o servidor
DataSnap. Interage com todos os outros componentes do
framework.
TDSTCPServerTransport: o componente responsvel pelo
transporte das informaes entre o servidor e os clientes,
neste caso atravs de um protocolo proprietrio.
TDSHTTPService: o componente responsvel pelo
transporte das informaes, porm via protocolo HTTP.

TDSServerClass: o componente que interage com as


classes que sero disponibilizadas pelo servidor.

32 de 40

Criando Web Services de Alto Desempenho com


Delphi

Funcionamento geral de um servidor DataSnap/REST


muito importante separar claramente as classes de negcios do seu
sistema com as classes e componentes do framework DataSnap, tanto no lado
cliente quanto no lado servidor.
As justificativas so muitas que se resumem em uma palavra:
ortogonalidade.

TDSHTTPService

TDSServer

TDSServerClass

Classe
Manipuladora

Classe de Negcio

Manipulando as requisies e respostas HTTP


Para explorar mais o assunto pode-se consultar a seguinte URL:
http://docwiki.embarcadero.com/RADStudio/XE6/en/DataSnap_REST_Messagi
ng_Protocol
Diferentemente de outros frameworks, no temos a possibilidade de
determinarmos as URLs que sero utilizados para acessar os recursos
disponibilizados pelo nosso sistema.
As URLs sero, ento, determinadas por justaposio, no seguinte
esquema:

PROTOCOLO
http://

TDSHTTPService
Contexto
DataSnap
localhost:8080
/arrayof
SERVIDOR

Classe Manipuladora
Contexto
REST
/usuario

Classe
/TUsuario

Mtodo
/Usuario

Parmetro
/Joo da Silva

Tabela 1 - URL por justaposio

O que ser feito com o usurio Joo da Silva determinado pelo


verbo HTTP utilizado no pedido: GET, POST, PUT ou DELETE. Ou seja, a URL ser a
mesma para qualquer uma das operaes CRUD.
Ento, para tratar as solicitaes dos clientes, necessrio criar uma
classe manipuladora de requisies HTTP. E para que esta classe seja aderente
ao DataSnap\REST necessrio atender algumas premissas:

33 de 40

Criando Web Services de Alto Desempenho com


Delphi
DSServerClass e a Classe manipuladora de requisies HTTP
A classe que ser utilizada para atender a requisio HTTP no deve ser
a mesma que efetuar os procedimentos solicitados. O ideal que sejam duas
classes distintas.
A primeira, que ser explicada nesta seo, para atender os requisitos
do DataSnap. A outra faz parte das regras de negcio. Se um dia mudarmos
de DataSnap para mORMt por exemplo, a classe manipuladora tem grandes
chances de no servir. Porm a classe de negcio tem que continuar
existindo.
Nos concentrando agora na classe manipuladora, para uma situao
simples de CRUD, temos que prever 4 mtodos nesta classe:
Verbo HTTP:
Prefixo no mtodo:

Consulta
GET
-

Alterao
POST
Update

Incluso
PUT
Accept

Excluso
DELETE
Cancel

Uma classe possvel seria:


{$METHODINFO ON}
TUsuario = class
private
// ...
public
function Usuario(const AID: Integer): TJSONValue;
function AcceptUsuario(AUsuario: TJSONValue): Boolean;
function CancelUsuario(AID: Integer): Boolean;
function UpdateUsuario(const AID: Integer; AUsuario: TJSONValue):
Boolean;
end;
{$METHODINFO OFF}
Listagem 1 - Exemplo de uma classe manipuladora

Ao publicar a classe TUsuario com o componente TDSServerClass ser


feito o seguinte mapeamento:

Recuperar
Inserir
Excluir
Alterar

Verbo HTTP
GET
PUT
DELETE
POST

Mtodo
Usuario()
AcceptUsuario()
CancelUsuario()
UpdateUsuario()

34 de 40

Criando Web Services de Alto Desempenho com


Delphi
Contedo JSON
Perceba na Listagem 1 que ora retornarmos um JSONValue, ora
recebemos como parmetro.
O DataSnap/REST sempre trafegar JSON. Mesmo que se retorne um
valor de tipo primitivo, como uma string ou boolean, por exemplo, o cliente
receber um JSON.
Isso denota uma dificuldade em se trafegar arquivos, o que ser
contornado um pouco mais frente desta apostila.
Quando o mtodo receber um JSON, o parmetro correspondente
deve ser declarado por ltimo, uma vez que no vir na URL, mas sim no corpo
da requisio HTTP.
Hackeando a resposta de um servidor DataSnap/REST

Quando se trabalha com um servidor DataSnap servindo a softwares


desenvolvidos em outras tecnologias, a estrutura do JSON disponibilizado pelo
DataSnap pode se mostrar inconveniente.
Alm disso, pode haver a necessidade de se trafegar outros formatos,
como por exemplo uma imagem.
Para estas necessidades podemos manipular o contedo da resposta. A
classe manipuladora, em algum momento deve invocar o mtodo
GetInvocationMetadata que retorna a instncia de TDSInvocationMetadata que
est atrelado comunicao em andamento, lembrando que estamos em
um contexto de uma thread.
Um algoritmo possvel seria:
procedure TClasseQualquer.Responder(AObjeto: TObject);
var
oRetorno: TDSInvocationMetadata;
begin
oRetorno := GetInvocationMetadata;
oRetorno.ResponseCode := 200;
oRetorno.ResponseMessage := 'OK';
oRetorno.ResponseContentType := 'application/json';
oRetorno.ResponseContent := Self.Serializar(AObjeto);
end;
Listagem 2 - Exemplo de utilizao do TDSInvocationMetadata

35 de 40

Criando Web Services de Alto Desempenho com


Delphi
Na

Listagem

2 temos um exemplo claro de utilizao do


TDSInvocationMetadata. No caso estamos manipulando as partes mais
relevantes da resposta.
Manipulando a QueryString da URL

No que tange especificamente ao DataSnap no h utilizao de


QueryString.
Porm este recurso pode ser muito til para influenciar na resposta, e um
exemplo imediato seria a paginao do resultado.
Em uma URL a QueryString se inicia aps um sinal de interrogao,
sendo uma lista de chave e valor separados por &.
Exemplo:
http://localhost/ds/rest/TClasse/Metodo/Param1?inicio=10&limite=10

Mais uma vez tiramos proveito do objeto TDSInvocationMetadata


corrente, como no exemplo a seguir:
var
oHTTP: TDSInvocationMetadata;
begin
oHTTP := GetInvocationMetadata;
//...
Self.FInicio := StrToIntDef(oHTTP.QueryParams.Values['inicio'], -1);
Self.FLimite := StrToIntDef(oHTTP.QueryParams.Values['limite'], -1);
//...
end;

Explorando algumas possibilidades


Vamos explorar algumas alternativas interessantes que o DataSnap nos
oferece.
Cache: Evitando armazenamento das informaes pelos browsers e proxies

Uma situao na qual devemos ficar atentos o armazenamento das


informaes JSON que o browser, ou proxies reversos, tendem a guardar e
reutilizar. O cacheamento de informaes.

36 de 40

Criando Web Services de Alto Desempenho com


Delphi
Devemos ento, mais uma vez, interferir na resposta adicionando os
parmetros necessrios para evitar esta situao. O local mais adequado
para se atingir este objetivo no evento Trace do componente
TDSHTTPService, como no exemplo a seguir:
procedure TDataModule1.DSHTTPService1Trace (Sender: TObject; AContext:
TDSHTTPContext; ARequest: TDSHTTPRequest; AResponse: TDSHTTPResponse);
var
_hacker: TDSHTTPResponseIndy;
begin
_hacker := TDSHTTPResponseIndy(AResponse);
_hacker.ResponseInfo.CustomHeaders.Values['Cache-Control'] := 'nostore, no-cache, must-revalidate, max-age=0';
end;

O objetivo de um framework, como o DataSnap justamente abstrair


certos problemas. E isso faz com que fique relativamente difcil, quando no
impossvel, contornar esses problemas.
Por isso que foi necessrio efetuar o typecast para a classe
TDSHTTPResponseIndy. E isso s foi possvel descobrir analisando os fontes do
DataSnap. Este exemplo funciona muito bem no Delphi XE2 mas pode deixar
de funcionar em verses posteriores. Pois no futuro a equipe de
desenvolvimento do DataSnap pode deixar de usar o Indy para a
comunicao HTTP.

37 de 40

Criando Web Services de Alto Desempenho com


Delphi

Modularizao de um servidor DataSnap


Para um melhor rendimento da equipe em relao ao desenvolvimento
de um servidor DataSnap altamente conveniente trabalharmos com BPLs ao
invs de grandes executveis. A ideia bsica termos BPLs especializadas,
que por sua vez tiram proveito de outras BPLs.
Procurando manter o baixo acoplamento entre as solues os impactos
das eventuais mudanas sero localizadas, no contaminando todo o
sistema.
O primeiro desafio ento desenvolvermos a aplicao servidora, ou
seja, o executvel que carregar as BPLs.

38 de 40

Criando Web Services de Alto Desempenho com


Delphi

Pool de Conexes com o Banco de Dados

39 de 40

Criando Web Services de Alto Desempenho com


Delphi

Para aprender mais


Nesta seo lista-se uma srie de referncias que julgamos pertinentes.
H tambm sugestes de livros e cursos.
Como um verdadeiro sistema REST funciona: arquitetura e desempenho na
Abril
por Luis Cipriani em 24/10/2012
http://www.infoq.com/br/presentations/rest-arquitetura-abril
http://www.slideshare.net/lfcipriani/como-um-verdadeiro-sistema-restfunciona-arquitetura-e-performance-na-abril

Guru-SP - Abusando nas requisies HTTP sem medo


Luis Cipriani
http://blip.tv/agaelebe/26_11_2011_gurusp_http_cipriani-720-5879314
https://speakerdeck.com/lfcipriani/abusando-nas-requisicoes-http-semmedo

O que ser idempotente em REST? O debate continua


por Mark Little , traduzido por Marcelo Cenerino em 24 Mai 2013
http://www.infoq.com/br/news/2013/05/idempotent?utm_source=twitterfeed
&utm_medium=twitter&utm_content=infoqbr

Livros recomendados

RESTful Servios Web


Web Services para o Mundo Real
Leonard Richardson & Sam Ruby
http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id
_link=8954&destino=/scripts/resenha/resenha.asp?nitem=2292748&

40 de 40

Anda mungkin juga menyukai