Criando Web Services de Alto Desempenho comDelphi Esta é a sua cópia pessoal da apostila Olá! É com grande satisfação que lhe disponibilizamos esta apostila sobre o tema Criando Web Services de Alto Desempenho com Delphi. ATENÇÃO: 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 não imprimiremos o material e acreditamos que em geral não há necessidade de se fazer isto. Por isto esta é uma cópia pessoal do material. Esperamos que você compartilhe este material com seus colegas. Sugestões de melhoria serão sempre bem vindas! Muito obrigado pelo prestígio de sua companhia. Sobre esta apostila Versão: 003 - Junho/2014 Revisor: José Mário 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 Sumário Esta é a sua cópia pessoal da apostila ...................................................................... 1 Sobre esta apostila ........................................................................................................ 1 Sobre a arrayOF ............................................................................................................. 1 Material de apoio .......................................................................................................... 4 Introdução ...................................................................................................................... 4 Protocolo de Transporte X Protocolo de Comunicação ......................................... 6 TCP/IP – Protocolo de Transporte ............................................................................. 6 HTTP – Protocolo de Comunicação ........................................................................ 7 Momento mão na massa: Criando o seu próprio protocolo .............................. 7 SOA – Arquitetura Orientada a Serviço ...................................................................... 8 Provedor ...................................................................................................................... 8 Consumidor ................................................................................................................. 8 Comunicação ............................................................................................................ 9 ROA - Arquitetura Orientada a Recursos ................................................................... 9 Entendendo o HTTP para entender o REST ................................................................. 9 Web Humana X Web Programável ....................................................................... 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 mão na massa........................................................................................ 18 Dominando o JSON ..................................................................................................... 19 Estrutura do JSON ................................................................................................. 19 Interagindo com o JSON pelo Delphi................................................................ 23 Momento mão na massa: Recuperando o aniversário e as fotos dos seus amigos do Facebook ........................................................................................... 24 Serialização 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 mão na massa: Nosso “Olá Mundo” em três camadas! ................. 31 Componentes envolvidos em um servidor DataSnap ........................................ 32 Funcionamento geral de um servidor DataSnap/REST....................................... 33 Manipulando as requisições e respostas HTTP ..................................................... 33 DSServerClass e a Classe manipuladora de requisições HTTP ....................... 34 Conteúdo 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 informações pelos browsers e proxies..................................................................................................................... 36 Modularização de um servidor DataSnap ............................................................... 38 Pool de Conexões 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 códigos dos exemplos citados nesta apostila estão disponíveis no GitHub: https://github.com/arrayOF/criando_web_services_alto_desempenho.git Introdução Existe uma grande mudança em curso: estamos saindo da era das soluções on premisse para as soluções in cloud. Esta mudança, que esta se acelerando cada vez mais, exige mudanças drásticas na forma como encaramos o desenvolvimento de software. Isto porque o usuário final quer a informação onde ele, o usuário, estiver. A necessidade de se possuir um servidor dedicado esta fazendo tanto sentido quanto a de um mainframe. Nós, desenvolvedores, precisamos nos reposicionar. Esta apostila trata deste assunto. Como nós, 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 não esta sozinho. Uma grande solução necessariamente envolve outras tecnologias. Ainda nesta apostila conheceremos um pouco de: Apache; Python; noSQL e mongoDB; É importante alinharmos as expectativas desde já em relação ao assunto principal, o Delphi. Como ele se posiciona neste novo cenário? Obviamente temos o DataSnap como tecnologia oficial da Embarcadero para soluções multi camadas. Porém para entender o funcionamento do DataSnap é necessário entender os conceitos que o sustenta e é este o objetivo primordial deste treinamento. 4 de 40 Orientação à Objeto e Metaprogramação com RTTI. Processamento concorrente e suas implicações – Thread.Criando Web Services de Alto Desempenho com Delphi Para isto vamos nos concentrar em quatro pilares de um framework REST: Protocolo de Comunicação – HTTP. 5 de 40 . Representação da Informação – JSON. dicas-l. É um mecanismo fantástico e vale a pena estudar! A piada a seguir dá uma ideia do que estamos falando: Computador 1: Olá.php#. Computador 2: Desculpe. pois foge ao escopo do treinamento. tem dois caracteres. switchs. TCP IP Protocolo de Controle de Transmissão Protocolo de Internet Então quando uma mensagem sai de um equipamento a outro é este protocolo que garante que a mensagem chegará ao seu destino. não possui um contexto. você gostaria de ouvir uma piada TCP? Computador 1: Sim. eu vou lhe contar uma piada TCP Computador 1: Ok. pois já temos preocupações demais). estou prestes a lhe enviar uma piada TCP. tem dois caracteres. não possui um contexto explícito. termina com uma punchline.br/arquivo/piada_tcp.U-wWNfldWYA 6 de 40 . Mas na verdade um não anula o outro. a sua conexão expirou. você gostaria de ouvir uma piada TCP? http://www. estou pronto para receber a sua piada TCP que irá durar 10 segundos. Ela irá durar 10 segundos. E o TCP/IP? O DataSnap aumenta ainda mais esta confusão ao oferecer dois protocolos: TCP e HTTP. Mas é importante entender que o protocolo TCP/IP é um protocolo de transporte entre os equipamentos de uma rede padrão Ethernet. 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. e termina com uma punchline. eu gostaria de ouvir uma piada TCP Computador 2: Ok. eu gostaria de ouvir uma piada TCP Computador 2: Olá. Vamos falar muito de HTTP durante o treinamento. Computador 1: Ok. Olá. mesmo que passe por dezenas de equipamentos e softwares como roteadores. TCP/IP – Protocolo de Transporte Não vamos nos aprofundar.com.Criando Web Services de Alto Desempenho com Delphi Protocolo de Transporte X Protocolo de Comunicação Antes de iniciarmos de fato faz diferença entender uma questão que é abstrata a muitos programadores (e tem que ser abstrato. proxies e por ai vai. As informações contidas em uma mensagem HTTP trafegam via TCP/IP de uma máquina à outra. Isso poderá ser via cabo serial ou via TCP/IP e para isso você terá que estudar o protocolo de comunicação do fabricante do equipamento. SMTP e por ai vai) que é o objeto central dos nossos estudos é um protocolo de comunicação entre softwares. pois são otimizados. onde haverá um servidor aguardando conexões e ao receber uma mensagem. Em teoria esses protocolos são mais rápidos que os disponíveis. mas eventualmente você precisará fazer uma integração com equipamentos de algum fabricante: Balança. a mensagem contida só fará sentido para este software se estiver em uma determinada estrutura – no nosso caso HTTP. devolverá a hora atual da máquina onde ele está. Quando os pacotes TCP/IP finalmente chegam ao software destinatário. assim como outros (FTP.Criando Web Services de Alto Desempenho com Delphi HTTP – Protocolo de Comunicação Já o HTTP. Máquina Fabril e por ai vai. não tendo informações supérfluas. 7 de 40 . Telefonia. Momento mão na massa: Criando o seu próprio protocolo Esperamos que isso nunca aconteça com você. É como se fosse uma “língua”. Vamos então desenvolver o nosso próprio protocolo. corretamente formatada. Esquema macro Provedor/Cliente Provedor Estrutura que provê funcionalidades de domínio de negócios. acompanhar a evolução Vale ressaltar de que é um modelo conceitual e. sistema de banco de dados e por ai vai. Isso porque ela promove a desvinculação entre o domínio do negócio (essencialmente as regras de negócio) e modelos específicos como linguagens de desenvolvimento. 8 de 40 . sistemas operacionais. Apesar desta descrição é possível também que um consumidor seja outro software “provedor”. mas nos dias atuais é difícil imaginar outra forma de operacionalizar o SOA. portanto esta arquitetura não implica necessariamente na existência de webservices. No nosso escopo é um conjunto de softwares com acesso a um banco de dados. Consumidor Estrutura de software que promove a visualização das informações bem como a interação com o usuário final.Criando Web Services de Alto Desempenho com Delphi SOA – Arquitetura Orientada a Serviço Arquitetura Orientada a Serviço é uma abordagem extremamente eficiente para a otimização dos recursos de TI de uma empresa. Basicamente temos dois papéis bem definidos: o de Provedor e o de Consumidor. Portanto a organização consegue tecnológica sem fazer grandes rupturas. CONSUMIDOR COMUNICAÇÃO PROVEDOR Figura 1 . Neste software estarão as regras de negócio. Aqui estamos falando de uma comunicação TCP/IP utilizando o protocolo HTTP para o DataSnap\REST. Em um mundo interconectado. ROA é um modo de resolver um problema em um serviço web REST..Criando Web Services de Alto Desempenho com Delphi Comunicação Para duas partes distintas se comunicarem é necessário haver um meio e um protocolo suportado por ambos. O objetivo desta seção. ROA . Mágica! As soluções de software.John Gall. É incrível o fato de muitos não se darem conta certamente por ser algo intangível. considerado como evoluído a partir de um simples que funcionava” . Com isto entenderemos o REST e finalmente o DataSnap\REST. E é este funcionamento que entenderemos a partir da próxima seção. sendo o SOAP sua implementação mais difundida. é o HTTP que permite toda esta. invariavelmente. “Um sistema complexo que funciona é. então. Mas o fato é que o HTTP é o protocolo que sustenta o planeta no que tange ao compartilhamento de conteúdo. tem que acompanhar esta realidade e há algum tempo conhecemos o SOA.. Aqui estamos colocando o REST em evidência e a forma como ele funciona é fortemente aderente ao HTTP. Porém nos últimos anos o REST vem ganhando força e seu aspecto mais marcante é o de justamente “reaproveitar” os conceitos do HTTP. é o de desmistificar o HTTP mostrando que não há mágica e sim simplicidade e eficiência. porém a abstração diminui um pouco. Entendendo o HTTP para entender o REST O HTTP está fortemente presente em nosso dia a dia e é interessante perceber esta realidade. então.Arquitetura Orientada a Recursos REST é a base do ROA: Arquitetura Orientada a Recursos. onde a informação está presente mesmo onde você não a quer. 9 de 40 . Continua existindo os mesmos elementos descritos na seção anterior (Provedor e Consumidor). Mas vamos estudar cada uma destas palavras e entender do que se trata. uma URL e horas de distração. No envelope vão as informações necessárias para que o carteiro consiga entregar ao destinatário. O “hiper” vem do grego e significa “sobre” ou “além”. seja no mesmo dispositivo. Para chegar ao seu destino toda esta estrutura passa por uma rede. Existem diversos protocolos além do HTTP como o FTP (transferência de arquivos). SMTP (envio de e-mail) e por ai vai. A humana é a que todos nós conhecemos: Um navegador. um conjunto de regras bem estabelecidas. TRANSFERÊNCIA Esta parte do significado do HTTP explicita o objetivo primário deste protocolo: a transferência. Vamos encarar então a rede e todo o seu aparato como o carteiro. HTTP O HTTP é a sigla para “Protocolo de Transferência de Hipertexto”. passando por uma rede local até chegar à grande web. A princípio pense no HTTP como um envelope. que torna possível a comunicação entre duas partes. Em um grande sistema eles se complementam. Já a WEB programável foi feita para ser consumida por softwares. PROTOCOLO Na informática protocolo é uma convenção. HIPERTEXTO Hipertexto basicamente é um texto com referências (os famosos links) que nos levam a outros textos. Transferir é fazer a movimentação da informação de uma ponta à outra. Provavelmente disto você já saiba. o que nos possibilita “saltar” do ponto em que estamos diretamente para um mais interessante. 10 de 40 . ou seja. Cada um com um propósito bem específico e não existe um protocolo melhor que outro de um modo geral. certo? E dentro do envelope há um conteúdo. Grosso modo é um texto que possui ligações com outros textos e estes com outros.Criando Web Services de Alto Desempenho com Delphi Web Humana X Web Programável Existem duas WEBs: a humana e a programável. em outras palavras. ou conjunto de princípios. Os objetivos da arquitetura REST vão mais além: Aumentar a escalabilidade. Definição clara das responsabilidades do cliente e do servidor. Em um sistema web isso é crucial afinal não desejamos reescrever os softwares quando percebermos que ele não está suportando a carga. para o desenvolvimento de sistemas distribuídos. dois termos são de suma importância: escalabilidade e latência. Diminuir a latência. Vamos falar então do “estado representacional”.Criando Web Services de Alto Desempenho com Delphi Obviamente isso já nos remete ao HTML que por sinal surgiu junto com o HTTP. Evolvabilidade. É fortemente baseado no HTTP tirando proveito de seus aspectos para simplificar o desenvolvimento de um serviço web. dai vem o termo recorrente stateless (sem estado). Não à toa HTML significa Linguagem de Marcação de Hipertexto. mas uma técnica. portanto. Da lista acima. uma arquitetura ou. Encapsulamento de sistemas legados. O REST não é uma tecnologia por si só. certo? 11 de 40 . a mensagem HTTP deve possuir todas as informações necessárias sobre o recurso que esta sendo trabalhado. Logo. modificar e repassar o estado do recurso. uma proposta de trabalho. REST REST é o acrônimo para “Transferência de Estado Representacional”. É. temos que entender ao máximo a proposta do REST para conseguir aplica-la na prática. que é a capacidade de evoluir e se adaptar. Estado Representacional O “estado representacional” refere-se à situação em que determinado recurso se encontra. Um consenso no REST é que ele não guarda estado. O termo “transferência” foi visto um pouco mais acima. Escalabilidade é a qualidade de permitir que se aumente a carga sem comprometer o sistema. Então cabe a cada ponta (cliente e servidor basicamente) receber. Sendo assim. ietf. O propósito primário é o de justamente recuperarmos de um computador remoto um determinado documento. o processamento pelo end-point (com um eventual acesso ao banco de dados) e todo o caminho de volta da resposta. O HTTP é um protocolo orientado a documentos. o HTTP e o HTML nasceram juntos. porém há muita responsabilidade nossa relacionada à programação. Muita coisa pode dar errada e comprometer o sistema.txt Dissecando o protocolo HTTP sob o ponto de vista do REST Nesta seção iremos nos aprofundar no HTTP.org/rfc/rfc2616. Apesar de não ser uma leitura obrigatória vale a pena citar que as especificações do HTTP estão no RFC 2616 cujo link é: http://www. é o tempo que leva para determinada tarefa ser executada: A solicitação do cliente. Ele é um dos principais autores da especificação do protocolo HTTP e não satisfeito cunhou o termo REST em uma tese de doutorado no ano de 2000. Roy Fielding e Tim Berners-Lee Há um elo muito importante entre o HTTP e o REST e o nome dele é Roy Fielding. Já a latência. o envio do pedido pela rede. E não estamos falando de página web ou da aplicação móvel. empresa responsável por um dos principais web-servers da indústria. Obviamente existem diversas outras mentes brilhantes envolvidas neste processo. Ou seja. Já o Tim Berners-Lee também é co-autor das especificações HTTP e seu principal objetivo foi a criação de um protocolo de transferência de objetos HTML.Criando Web Services de Alto Desempenho com Delphi Para trabalhar na web o sistema tem que ser desenhado para isso. O HTTP é muito amplo. Há problemas relacionados à infraestrutura de rede. a recepção pelos servidores envolvidos (proxy. 12 de 40 . Temos que sempre identificar e agir para diminuir a latência. de modo geral. portanto focaremos nos aspectos que farão diferença no desenvolvimento de uma aplicação REST. Estamos falando de back-end. roteadores e por ai vai). Vale citar que ele é um dos fundadores da Apache Foundation. que são documentos estruturados para a interpretação de um navegador web. Lembre-se sempre da analogia com um envelope.1. O cabeçalho termina.0 (Windows NT 6.1↵ User-Agent: Mozilla/5. Com isso fica evidente outra característica importante do HTTP que é o fato dele ser baseada no paradigma de requisição e reposta. mais especificamente a ação e a identificação do conteúdo sendo trabalhado bem como a versão do protocolo HTTP. Requisição No HTTP a ponta cliente faz uma requisição para a ponta servidora utilizando o seguinte protocolo: 13 de 40 . que são pares de chave e valor e contêm diversas informações sobre o conteúdo e sobre o software que esta enviando a mensagem. Cada informação esta presente em uma linha em texto ASCII. Com essas informações serão tomadas as melhores decisões em relação ao conteúdo da mensagem. Em seguida vem o cabeçalho HTTP propriamente dito.Criando Web Services de Alto Desempenho com Delphi Na web humana o formato de documento mais evidente é o HTML. A primeira linha contêm informações especiais sobre a mensagem. com uma quebra de linha simples. então. WOW64) …↵ Content-Type: application/json↵ Content-Length: 21↵ ↵ {“nome”: “olá mundo”} Cabeçalho HTTP O cabeçalho HTTP contêm diversas informações que serão usadas pelo software receptor da mensagem. Regras gerais do protocolo HTTP Uma mensagem HTTP possui três partes distintas: Cabeçalho HTTP Quebra de linha indicando o fim cabeçalho HTTP Conteúdo (opcional) POST /mensagem HTTP/1. Criando Web Services de Alto Desempenho com Delphi GET /index.br↵ ↵ Na primeira linha temos: O método HTTP: GET O caminho do recurso a ser trabalhado: /index. Qual usar? 14 de 40 . URL X URI Comumente fica a dúvida sobre as diferenças entre os termos URL e URI. Este tamanho é em bytes.exemplo.html HTTP/1.1 O status da resposta: 200 Uma descrição do status da resposta: OK Em seguida temos o cabeçalho HTTP.com. Chamo a atenção para o content-length que encerra justamente o tamanho do conteúdo que esta sendo trafegado. Após o fim do cabeçalho (com a devida quebra de linha final) temos o conteúdo.1 Quebra de linha Da segunda linha em diante temos o cabeçalho HTTP. No exemplo temos um conteúdo HTML. São pares de chave e valor delimitados por dois pontos.html A versão do protocolo HTTP: HTTP/1. No exemplo temos apenas uma informação adicional que é o host do servidor em que o recurso está hospedado. Resposta Após o processamento da solicitação 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 versão do protocolo HTTP: HTTP/1.1↵ Host: www. no contexto HTTP e REST. Finalmente. Um exemplo é o ISBN de um livro qualquer: urn:isbn:0451450523 A URL. de um modo geral.wikipedia. que identifica unicamente um recurso independentemente da localização. não é errado afirmar que estamos desenvolvendo orientado a recursos. Tem a seguinte notação: [protocolo]://[servidor]:[porta]/[caminho]/[recurso] Já a URI é uma definição mais abstrata: cadeia de caracteres compacta usada para identificar ou denominar um recurso.org/wiki/URL http://pt.wikipedia. pois eventualmente ignoramos a existência da URN.org/wiki/URI Classes de Recurso e Recurso Como percebemos. De um arquivo a uma impressora. a informação que trafega entre as partes interessadas é denominada “recurso”. Podendo então ser ou uma URL ou uma URN. De certa forma a confusão existe. Maiores informações em: http://pt.org/wiki/URN http://pt. a utilização do termo URL se mostra tão correto quanto URI aparecendo ambas na literatura. Quando desenvolvemos uma solução sob este paradigma. Fazendo um paralelo à OOP.Criando Web Services de Alto Desempenho com Delphi URI URL URN Identificador Padrão de Recurso Localizador Padrão de Recursos Nome Padrão de Recurso Não há uma diferença muito clara. a Classe de Recursos equivale a uma Classe ao passo que um Recurso equivale a uma Instância. identifica um recurso disponível em uma rede.wikipedia. Exemplo: Classe de Recursos Recursos Clientes Empresa XYZ Empresa ABC 15 de 40 . Criando Web Services de Alto Desempenho com Delphi Recurso Ativado A princípio o recurso é representado por um arquivo físico. “idade”: 45 } YAML .org/wiki/YAML . empresa_xyz. deve ser representado de alguma forma.45. JSON e YAML sendo o JSON o mais popular nos sistemas REST.json.nome: João da Silva Idade: 57 16 de 40 . CSV “João da Silva”. pois é gerado a partir do processamento de informações dispersas. Representação do Recurso Um recurso.wikipedia.http://pt. Para uma imagem ou arquivo binário não há dúvidas. Mas como representar um cliente.json ou empresa_abc. Obviamente que na vida real informações deste tipo estarão em um banco de dados. Mas isso não deixa de ser um recurso. como por exemplo. obviamente. sendo referido então como um Recurso Ativado. por exemplo? Os formatos mais usuais são o XML. INI NOME=João da Silva IDADE=45 XML <xml> <nome>João da Silva</nome> <idade>45</idade> </xml> JSON { “nome”: “João da Silva”. também chamado de “verbo HTTP” ou “ação HTTP” é um conjunto bem definido e limitado de palavras chaves que indicam a ação que o sistema cliente deseja efetuar em relação ao recurso.blog.br/2007/07/02/post-vs-put-quem-insere-e-quem-altera/ Essa discussão nasce quando fazemos a associação entre comandos SQL e verbos HTTP – o que é natural no começo. mas existem 17 de 40 . As ações mais relevantes em REST são: Método GET PUT POST DELETE Ação 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 métodos HTTP são associados às operações CRUD: CRUD Create Read Update Delete SQL INSERT SELECT UPDATE DELETE HTTP POST GET PUT DELETE Ação Criar Recuperar Modificar ou Criar Eliminar Existe uma discussão frequente sobre a real diferença entre os verbos PUT e POST. Um artigo interessante esta em: http://gc. Sempre buscamos o “200 OK”. Status HTTP Na resposta HTTP provavelmente a informação mais relevante (antes do conteúdo) é o código de status.Criando Web Services de Alto Desempenho com Delphi HTML <html> <body> <div class=”nome”>João da Silva</div> <div class=”idade”>45</div> </body> </html> Interface Uniforme O método HTTP. Porém isto esta sujeito às falhas humanas: esquecimento. erro de digitação e por ai vai. Afinal muitos cálculos são feitos em cima deste valor. Momento mão na massa Uma necessidade recorrente é de recuperarmos o valor do dólar para registrarmos em nosso sistema. então. recuperar este valor da Internet? Um site que possui esta informação é o Dolar Hoje: http://dolarhoje. No “Apêndice A” descreve-se os mais interessantes e o contexto em que eles aparecem. Porque não.Criando Web Services de Alto Desempenho com Delphi outros. Obviamente que a solução mais imediata que podemos desenvolver é uma tela de cadastro simples.com/ 18 de 40 . É uma formatação leve para intercâmbio de dados e uma ótima alternativa ao XML. mas ficará de fora do escopo deste treinamento por ainda não ter aplicabilidade imediata. É caracterizado por uma cadeia de caracteres encerrados por aspas duplas. Porém. no caso Delphi e JavaScript. Não à toa tem este nome. assim como no Delphi. Alguns detalhes ficam mais obscuros ainda para nós. Mais a frente nesta apostila falaremos do mongoDB e a “cultura” noSQL. Mas afinal. Tendo isso em mente fica mais fácil absorver os conceitos. pois surgiu no âmbito do JavaScript.org/json-pt. devido às particularidades das linguagens. O mongoDB guarda as informações no formato JSON.Criando Web Services de Alto Desempenho com Delphi Dominando o JSON O formato adotado pelos atuais webservices para representação de informação é o JSON. JSON é o acrônimo de JavaScript Object Notation. linguagem majoritariamente utilizada para criar front-ends web. Porém devemos ficar atentos aos caracteres escapados como o \n que representa uma quebra de linha. Temos tendência a complicar as coisas e quando nos deparamos com algo simples estranhamos. um string JSON possui algumas peculiaridades em sua formatação. por ter vindo de outro contexto. representa uma informação textual. o que caracteriza uma informação JSON? Estrutura do JSON As imagens a seguir foram retiradas do site oficial do JSON: http://www. desenvolvedores Delphi. ou como preferimos nos referir.json. Um novo formato que esta criando popularidade é o YAML. JSON String Uma string. 19 de 40 .html JSON é simples. “não relacional”. Criando Web Services de Alto Desempenho com Delphi Exemplos de strings válidos: “” “mário. A parte decimal é definida pela presença do ponto. Importante notar a ausência das aspas duplas nas extremidades. o que caracterizaria uma string.guedes” “Fernanda\nJúlio” JSON Number Um número é representado por uma cadeia de dígitos com o sinal negativo no começo quando for o caso. Exemplos de números válidos: 0 -10 30.15 20 de 40 . ou seja. JSON Null Para representar um valor nulo. com as letras em minúsculo e sem aspas duplas nas extremidades. com as letras em minúsculo e sem aspas duplas nas extremidades. JSON False Para representar o valor booleano falso usamos a seguinte notação: false Ou seja.Criando Web Services de Alto Desempenho com Delphi JSON True Para representar o valor booleano verdadeiro usamos a seguinte notação: true Ou seja. 21 de 40 . usa-se a notação: null Ou seja. inexistente. a palavra true. a palavra null com as letras em minúsculo e sem aspas duplas nas extremidades. a palavra false. cada par separado por uma vírgula do outro par e por fim todos os pares encerrados por chaves. Um objeto JSON é caracterizado por um conjunto de pares de chave e valor. todos eles encerrados por colchetes. “filhos” : [“julio”. false. “idade” : 36. 3]] JSON Object Um objeto JSON é um conjunto desordenado de pares de chave e valor. 2. 36. Exemplos válidos: {} {“nome” : “mário. Exemplos de arrays válidos: [] [“mario. [1.guedes”} {“nome” : “mário. null.guedes” . true. Um array é caracterizado por vários valores separados por vírgula. fernanda]} 22 de 40 .Criando Web Services de Alto Desempenho com Delphi JSON Array Um array JSON é uma lista desordenada de valores de qualquer tipo.guedes”. Assim como no XML é necessário criar rotinas recursivas. por isso.DBXJSON seguindo o esquema definido na Figura 2: Figura 2 . Interagindo com o JSON pelo Delphi O Delphi possui classes nativas para interagir com o JSON. é representado por uma string incluindo. No dia a dia não parecerá uma boa ideia por envolver muito código. portanto.Hierarquia das classes 23 de 40 . as aspas duplas nas extremidades. até mesmo outro JSON Object. seguindo uma filosofia de trabalho que privilegia a simplicidade. por si só. Já o valor pode ser de qualquer tipo. As classes para interagir com JSON estão na unit Data. o ideal será criar um esquema de serialização e deserialização de objetos.Criando Web Services de Alto Desempenho com Delphi Perceba que a chave. pois no fim é o que construiremos com o nosso aplicativo: uma API REST Imaginemos então um aplicativo que liste nossos amigos e nos dê a data de aniversário. mas sim de captar o “espírito da coisa”.facebook. O objetivo deste exercício não é o de nos aprofundarmos na API do Facebook. Figura 3 . o Aumento de vazão e consequentemente da escalabilidade Aderência às linguagens modernas – JavaScript. Outros exemplos. Logado no Facebook vamos acessar esta URL: https://developers. Google e seus serviços. uma área em que usamos uma API REST e fazemos uma integração com o aplicativo.Tela inicial da área para desenvolvedores 24 de 40 . Tem a parte social que todos conhecem e a parte “programática”. ou seja. Vamos explorar alguns aspectos relacionados à nossa conta pessoal no Facebook. Diminuição de tráfego de rede.com/ Entre diversas ferramentas temos o Graph Explorer e é este recurso que iremos utilizar. Um exemplo de um grande serviço web é o Facebook.Criando Web Services de Alto Desempenho com Delphi Momento mão na massa: Recuperando o aniversário e as fotos dos seus amigos do Facebook Grandes serviços web optam pelo JSON por vários motivos: Legibilidade. Python e Ruby por exemplo. LinkedIN entre diversos outros. para citar os mais conhecidos são: Twitter. que é um código especial que nos identifica no sistema bem como os recursos que queremos ter acesso.Criando Web Services de Alto Desempenho com Delphi Este recurso não permite uma integração total com Facebook mas já é o suficiente.Especificando os recursos com os quais se deseja interagir 25 de 40 .Botão para a obtenção do TOKEN Para a geração do TOKEN é necessário especificar os recursos com os quais se deseja interagir. Para isso precisamos de um TOKEN de acesso. Basicamente permite interagir com as informações relacionadas à nossa conta pessoal. Este TOKEN tem validade de uma hora: Figura 4 . Figura 5 . Criando Web Services de Alto Desempenho com Delphi Serialização de objetos 26 de 40 . 27 de 40 . seja ele o SQL Server.. como um “deus” que tudo pode. Por outro lado. Delegar ao banco de dados tarefas outras que não tem haver com dados é um contra senso. no banco de dados! Enfim: Banco de dados é para armazenar dados. devemos evitar ao máximo fixar as instruções SQL em nosso sistema. E esta seção tenta mensurar os ganhos e as perdas. Devemos deixar de encarar o banco relacional. Precisa armazenar imagens? Joga no banco de dados! Precisa armazenar os XMLs da NFe? Joga no banco de dados! Precisa fazer comunicação inter-processos? Um programa grava e outro lê. Obviamente que uma escolha implica em renúncias. O ideal é tornar o processo o mais dinâmico possível. E utilizar técnicas de ORM nos trás esta flexibilidade.. Oracle ou o MariaDB.Criando Web Services de Alto Desempenho com Delphi ORM – Mapeamento Objeto – Relacional O ORM é uma técnica de desenvolvimento muito importante na construção de um software de alto desempenho. Criando Web Services de Alto Desempenho com Delphi DataSnap O DataSnap é a tecnologia padrão do Delphi para a criação de soluções multicamada. 28 de 40 . Obviamente que esta afirmação embute na verdade um tremendo desafio no que tange à arquitetura da solução. um único software. Vamos simplesmente esquecer o passado. Antes tínhamos que desenvolver. A proposta do DataSnap. ainda em linhas gerais. é o de publicar classes e métodos para uso remoto.Esquematização geral do funcionamento do DataSnap Com isto estamos saindo do modelo cliente/servidor para o modelo multi camadas. ao menos no que tange à proposta do treinamento e focar no momento atual. em linhas gerais. 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 . de uma maneira geral. Agora teremos que. desenvolver dois softwares – o cliente e o servidor. Há todo um histórico sobre esta tecnologia que não vamos discutir nesta apostila. É óbvio que um nível de dependência é inevitável.. E isto não é pouca coisa.br/colocando-um-servidor-datasnap-a-provarevista-clubedelphi-magazine-151/28228 Apesar disto o DataSnap é uma tecnologia viável e é a arquitetura de toda a solução é que ditará o sucesso ou não da empreitada.devmedia. Nunca devemos depender 100% de uma tecnologia. rodando em máquinas diferentes isso seria extremamente desafiador de se fazer por conta própria.com.com/2012/11/22/datasnap-analysisbased-on-speed-stability-tests/ http://robertocschneiders.wordpress. Os grandes vilões são a biblioteca Indy (comunicação TCP/IP) e o dbExpress (acesso a banco de dados). Por serem dois softwares diferentes. Utilizando o DataSnap estamos deixando um pouco de lado as seguintes preocupações: Comunicação TCP/IP: Toda a complexidade de fazer dois softwares “conversarem” entre si já esta resolvida..wordpress. http://robertocschneiders. Meta-programação: O cliente enviará mensagens e o servidor “magicamente” irá instanciar e executar o método da classe correspondente. Isso ressalta o mantra da Ortogonalidade. Não precisando se preocupar com essas tecnologias você se concentra rapidamente no motivo de ser do seu sistema. Infelizmente o DataSnap é bastante criticado por aqueles que o compara com outras soluções e há um post muito popular do Roberto Schneiders que faz uma criteriosa análise de desempenho e em vários aspectos.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 construção de um sistema multicamada.com/2013/01/09/datasnap-analysisbased-on-speed-stability-tests-part-2/ A “Clube Delphi” possui o post traduzido pelo próprio autor: http://www. 29 de 40 . Mas. 30 de 40 .info/fossil/wiki/Synopse+OpenSource https://code.io/brookframework/ Mas repete-se o conselho: evite criar um vínculo extremo com o framework adotado. O propósito do nosso treinamento é justamente o de apontar o caminho para criar esta tal ortogonalidade. Não temos conhecimento prático nestas alternativas.com/site/remotedb. Mas o que significa esta escolha? TCP/IP Aderente apenas a clientes Delphi Possibilidade de trabalhar RAD Conexão persistente: Maior velocidade Menor escalabilidade HTTP Aderente a qualquer cliente HTTP Potencialmente exige mais código Conexão não persistente: Menor velocidade (?) Maior escalabilidade Nosso treinamento irá focar na comunicação HTTP apesar da possibilidade de um único servidor poder ter os dois modos de comunicação. Esta escolha se deve às exigências do mercado que pede maior interoperabilidade. Com esta escolha.com/p/delphionrails/ http://www. E este objetivo só pode ser alcançado com o HTTP: O mundo fala em HTTP.tmssoftware.Criando Web Services de Alto Desempenho com Delphi Existe alternativas ao DataSnap? Sim e algumas bem conceituadas. A primeira grande escolha que se deve fazer é quanto ao protocolo de comunicação. tornando assim a sua solução perene.asp http://silvioprog.github. o sistema estará apto a atender qualquer cliente HTTP: Outros webservices.google. Hoje nós temos duas opções: TCP/IP e REST. 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. DataSnap TCP/IP X DataSnap REST Como nosso foco é o DataSnap vamos concentrar os esforços nele. Aplicativos web. Momento mão na massa: Nosso “Olá Mundo” em três camadas! A fim de quebrarmos o gelo vamos desenvolver o nosso primeiro exemplo sem maiores explicações. em especial o JavaScript. 31 de 40 .Criando Web Services de Alto Desempenho com Delphi Softwares desenvolvidos em diversas linguagens rodando em qualquer plataforma. Aplicativos mobile (que exigem uma arquitetura mais leve). Criando Web Services de Alto Desempenho com Delphi Componentes envolvidos em um servidor DataSnap TDSServer: Componente que efetivamente é o servidor DataSnap. TDSHTTPService: É o componente responsável pelo transporte das informações. Interage com todos os outros componentes do framework. neste caso através de um protocolo proprietário. 32 de 40 . TDSServerClass: É o componente que interage com as classes que serão disponibilizadas pelo servidor. porém via protocolo HTTP. TDSTCPServerTransport: É o componente responsável pelo transporte das informações entre o servidor e os clientes. tanto no lado cliente quanto no lado servidor. Então. Ou seja.com/RADStudio/XE6/en/DataSnap_REST_Messagi ng_Protocol Diferentemente de outros frameworks. a URL será a mesma para qualquer uma das operações CRUD. para tratar as solicitações dos clientes. não temos a possibilidade de determinarmos as URLs que serão utilizados para acessar os recursos disponibilizados pelo nosso sistema.Criando Web Services de Alto Desempenho com Delphi Funcionamento geral de um servidor DataSnap/REST É muito importante separar claramente as classes de negócios do seu sistema com as classes e componentes do framework DataSnap. TDSHTTPService TDSServer TDSServerClass Classe Manipuladora Classe de Negócio Manipulando as requisições e respostas HTTP Para explorar mais o assunto pode-se consultar a seguinte URL: http://docwiki. E para que esta classe seja aderente ao DataSnap\REST é necessário atender à algumas premissas: 33 de 40 .embarcadero. POST.URL por justaposição O que será feito com o usuário “João da Silva” é determinado pelo verbo HTTP utilizado no pedido: GET. determinadas por justaposição. PUT ou DELETE. As justificativas são muitas que se resumem em uma palavra: ortogonalidade. então. é necessário criar uma classe manipuladora de requisições HTTP. As URLs serão. no seguinte esquema: PROTOCOLO http:// TDSHTTPService Contexto DataSnap localhost:8080 /arrayof SERVIDOR Classe Manipuladora Contexto REST /usuario Classe /TUsuario Método /Usuario Parâmetro /João da Silva Tabela 1 . para uma situação simples de CRUD. public function Usuario(const AID: Integer): TJSONValue.Criando Web Services de Alto Desempenho com Delphi DSServerClass e a Classe manipuladora de requisições HTTP A classe que será utilizada para atender a requisição HTTP não deve ser a mesma que efetuará os procedimentos solicitados. O ideal é que sejam duas classes distintas.. function UpdateUsuario(const AID: Integer. Nos concentrando agora na classe manipuladora.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 Método Usuario() AcceptUsuario() CancelUsuario() UpdateUsuario() 34 de 40 . AUsuario: TJSONValue): Boolean. function CancelUsuario(AID: Integer): Boolean. temos que prever 4 métodos nesta classe: Verbo HTTP: Prefixo no método: Consulta GET - Alteração POST Update Inclusão PUT Accept Exclusão DELETE Cancel Uma classe possível seria: {$METHODINFO ON} TUsuario = class private // . {$METHODINFO OFF} Listagem 1 . a classe manipuladora tem grandes chances de não servir. function AcceptUsuario(AUsuario: TJSONValue): Boolean. é para atender os requisitos do DataSnap. A primeira. end. Se um dia mudarmos de DataSnap para mORMt por exemplo. Porém a classe de negócio tem que continuar existindo. que será explicada nesta seção. A outra faz parte das regras de negócio.. oRetorno. A classe manipuladora.Exemplo de utilização do TDSInvocationMetadata 35 de 40 .ResponseContentType := 'application/json'.Serializar(AObjeto). Para estas necessidades podemos manipular o conteúdo da resposta. Isso denota uma dificuldade em se trafegar arquivos. em algum momento deve invocar o método GetInvocationMetadata que retorna a instância de TDSInvocationMetadata que está atrelado à comunicação em andamento. begin oRetorno := GetInvocationMetadata. mas sim no corpo da requisição HTTP. lembrando que estamos em um contexto de uma thread. a estrutura do JSON disponibilizado pelo DataSnap pode se mostrar inconveniente. como uma string ou boolean. oRetorno.Responder(AObjeto: TObject). oRetorno. ora recebemos como parâmetro. Hackeando a resposta de um servidor DataSnap/REST Quando se trabalha com um servidor DataSnap servindo a softwares desenvolvidos em outras tecnologias.ResponseMessage := 'OK'. Quando o método receber um JSON. oRetorno. o cliente receberá um JSON. uma vez que não virá na URL. o parâmetro correspondente deve ser declarado por último. end. Além disso. Um algoritmo possível seria: procedure TClasseQualquer.ResponseContent := Self. Mesmo que se retorne um valor de tipo primitivo. o que será contornado um pouco mais à frente desta apostila. pode haver a necessidade de se trafegar outros formatos. var oRetorno: TDSInvocationMetadata. O DataSnap/REST sempre trafegará JSON. por exemplo. como por exemplo uma imagem. Listagem 2 .ResponseCode := 200.Criando Web Services de Alto Desempenho com Delphi Conteúdo JSON Perceba na Listagem 1 que ora retornarmos um JSONValue. begin oHTTP := GetInvocationMetadata. -1)... Self. No caso estamos manipulando as partes mais relevantes da resposta.QueryParams.Values['limite']. sendo uma lista de chave e valor separados por &. -1). //. Porém este recurso pode ser muito útil para influenciar na resposta.FLimite := StrToIntDef(oHTTP.QueryParams. Cache: Evitando armazenamento das informações pelos browsers e proxies Uma situação na qual devemos ficar atentos é o armazenamento das informações JSON que o browser. end. e um exemplo imediato seria a paginação do resultado. Exemplo: http://localhost/ds/rest/TClasse/Metodo/Param1?inicio=10&limite=10 Mais uma vez tiramos proveito do objeto TDSInvocationMetadata corrente. Em uma URL a QueryString se inicia após um sinal de interrogação. Explorando algumas possibilidades Vamos explorar algumas alternativas interessantes que o DataSnap nos oferece.FInicio := StrToIntDef(oHTTP. O cacheamento de informações. Self.. como no exemplo a seguir: var oHTTP: TDSInvocationMetadata. //.Criando Web Services de Alto Desempenho com Delphi Na Listagem 2 temos um exemplo claro de utilização do TDSInvocationMetadata.Values['inicio']. 36 de 40 . Manipulando a QueryString da URL No que tange especificamente ao DataSnap não há utilização de QueryString. ou proxies reversos. tendem a guardar e reutilizar.. E isso só foi possível “descobrir” analisando os fontes do DataSnap. ARequest: TDSHTTPRequest. end. must-revalidate.CustomHeaders. E isso faz com que fique relativamente difícil. quando não impossível. como no exemplo a seguir: procedure TDataModule1. _hacker. O objetivo de um framework. interferir na resposta adicionando os parâmetros necessários para evitar esta situação. begin _hacker := TDSHTTPResponseIndy(AResponse). no-cache. Por isso que foi necessário efetuar o typecast para a classe TDSHTTPResponseIndy. 37 de 40 . AResponse: TDSHTTPResponse). var _hacker: TDSHTTPResponseIndy. como o DataSnap é justamente abstrair certos problemas. Pois no futuro a equipe de desenvolvimento do DataSnap pode deixar de usar o Indy para a comunicação HTTP.Values['Cache-Control'] := 'nostore. Este exemplo funciona muito bem no Delphi XE2 mas pode deixar de funcionar em versões posteriores.DSHTTPService1Trace (Sender: TObject. contornar esses problemas. AContext: TDSHTTPContext. max-age=0'.Criando Web Services de Alto Desempenho com Delphi Devemos então.ResponseInfo. O local mais adequado para se atingir este objetivo é no evento Trace do componente TDSHTTPService. mais uma vez. não contaminando todo o sistema.Criando Web Services de Alto Desempenho com Delphi Modularização de um servidor DataSnap Para um melhor rendimento da equipe em relação ao desenvolvimento de um servidor DataSnap é altamente conveniente trabalharmos com BPLs ao invés de grandes executáveis. O primeiro desafio então é desenvolvermos a aplicação servidora. o executável que carregará as BPLs. que por sua vez tiram proveito de outras BPLs. ou seja. Procurando manter o baixo acoplamento entre as soluções os impactos das eventuais mudanças serão localizadas. A ideia básica é termos BPLs especializadas. 38 de 40 . Criando Web Services de Alto Desempenho com Delphi Pool de Conexões com o Banco de Dados 39 de 40 . Como um verdadeiro sistema REST funciona: arquitetura e desempenho na Abril por Luis Cipriani em 24/10/2012 http://www.asp?nitem=2292748& 40 de 40 .Abusando nas requisições HTTP sem medo Luis Cipriani http://blip.br/scripts/cultura/externo/index.infoq.com/lfcipriani/abusando-nas-requisicoes-http-semmedo O que é ser idempotente em REST? O debate continua por Mark Little .tv/agaelebe/26_11_2011_gurusp_http_cipriani-720-5879314 https://speakerdeck.Criando Web Services de Alto Desempenho com Delphi Para aprender mais Nesta seção lista-se uma série de referências que julgamos pertinentes.net/lfcipriani/como-um-verdadeiro-sistema-restfunciona-arquitetura-e-performance-na-abril Guru-SP . Há também sugestões de livros e cursos.com. traduzido por Marcelo Cenerino em 24 Mai 2013 http://www.slideshare.com/br/news/2013/05/idempotent?utm_source=twitterfeed &utm_medium=twitter&utm_content=infoqbr Livros recomendados RESTful Serviços Web Web Services para o Mundo Real Leonard Richardson & Sam Ruby http://www.com/br/presentations/rest-arquitetura-abril http://www.infoq.livrariacultura.asp?id _link=8954&destino=/scripts/resenha/resenha.
Report "Criando Web Services de Alto Desempenho Com Delphi"