Forum.pcsoft.fr/pt-BR/pcsoft.br.windev/1231-exemplo-webservice-rest-usando-webdev/read.awp
Prezados,
Vamos fazer aqui um passo a passo de como trabalhar com um Webservice REST.
Bom afinal, o que é um Webservice Rest?
SOAP
SOAP é um protocolo de transferência de mensagens em formato XML para uso em ambientes distribuídos. O padrão SOAP funciona como um tipo de framework que permite a interoperabilidade entre diversas plataformas com mensagens personalizadas.
Aplicando este padrão em Web Services, geralmente usa-se o WSDL para descrever a estrutura das mensagens SOAP e as ações possíveis em um endpoint.
Uma das maiores vantagens disso é que várias linguagens e ferramentas conseguem ler e gerar mensagens facilmente. Várias linguagens de programação permitem a geração de objetos de domínio, Stubs e Skeletons a partir da definição do WSDL, permitindo a comunicação remota via RPC através de chamadas a métodos remotos, inclusive com argumentos complexos, como se fossem chamadas locais.
O problema desse padrão, é que ele adiciona um overhead considerável, tanto por ser em XML quanto por adicionar muitas tags de meta-informação. Além disso, a serialização e desserialização das mensagens pode consumir um tempo considerável.
REST
REST é outro um protocolo de comunicação, baseado no protocolo de hipermídia HTTP. Porém ele não impõe restrições ao formato da mensagem, apenas no comportamento dos componentes envolvidos.
A maior vantagem do protocolo REST é sua flexibilidade. O desenvolvedor pode optar pelo formato mais adequado para as mensagens do sistema de acordo com sua necessidade específica. Os formatos mais comuns são JSON, XML e texto puro, mas em teoria qualquer formato pode ser usado.
Isso nos leva a outra vantagem: quase sempre Web Services que usam REST são mais "leves" e, portanto, mais rápidos.
O problema com o REST pode surgir justamente por causa de suas vantagens. Como a definição do corpo de dados fica totalmente a cargo do desenvolvedor, os problemas de interoperabilidade são mais comuns.
SOAP ou REST?
Aviso: Esta é uma opinião pragmática.
Em geral, SOAP é uma boa opção para instituições com padrões rígidos e ambientes complexos (várias plataformas e sistemas). Muitas ferramentas corporativas (como ESB) tiram vantagem do padrão e possibilitam filtrarem, enfileiramento, classificação e redirecionamento das mensagens trocadas entre sistemas.
No restante, para uso no dia-a-dia, não vejo motivos concretos para não usar REST e JSON. Praticamente todas as plataformas e linguagens modernas que conheço suportam esses conceitos e a solução final é muito mais simples do que o equivalente em SOAP.
Além disso, integrações com alto volume de requisições são inviáveis em SOAP. REST é capaz de atender volume e complexidade sem dificuldades, exigindo apenas um mínimo de experiência do desenvolvedor para estabelecer e reforçar os padrões adequados.
O REST é simples de entender e pode ser adotado em praticamente qualquer cliente ou servidor com suporte a HTTP/HTTPS. Os desenvolvedores que o utilizam citam, como principais vantagens a facilidade no desenvolvimento, o aproveitamento da infraestrutura web existente e um esforço de aprendizado pequeno.
Por outro lado, o SOAP, avô das interfaces de serviços web, não deixará de ser usado tão cedo. Com o SOAP v 1.2, muitas das deficiências percebidas nessa tecnologia foram corrigidas e aumentou a facilidade de uso. Além disso, a sigla SOAP deixou de representar "Simple Object Access Protocol". Na especificação 1.2 da W3C, SOAP é apenas o nome da especificação.
Utilizar o SOAP 1.2 traz uma carga adicional não encontrada ao usar REST, mas há também vantagens. Primeiramente o SOAP é baseado em XML, de três formas: o envelope, que define o conteúdo da mensagem e informa como processá-la; um conjunto de regras de codificação para os tipos de dados; e o layout para os procedimentos de chamadas e respostas. Esse "envelope" é enviado por meio de (por exemplo) HTTP/HTTPS. E uma RPC (Remote Procedure Call) é executada, e o envelope retorna com as informações do documento XML formatado.
Uma das vantagens do SOAP é o uso de um método de transporte "genérico". Enquanto que o REST faz uso de HTTP/HTTPS, o SOAP pode usar qualquer meio de transporte existente para enviar sua requisição, desde SMTP até mesmo JMS (Java Messaging Service). No entanto, uma desvantagem percebida no uso de XML é a sua natureza prolixa e o tempo necessário para analisar o resultado apresentado.
Mas uma história não contada é que ambas as tecnologias podem ser misturadas e combinadas. O REST é fácil de entender e extremamente acessível porém faltam padrões, e a tecnologia é considerada apenas uma abordagem arquitetural. Em comparação, o SOAP é um padrão da indústria, com protocolos bem definidos e um conjunto de regras bem estabelecidas.
Pode-se afirmar, então, que casos onde o REST funciona bem são:
Situações em que há limitação de recursos e de largura de banda: A estrutura de retorno é em qualquer formato definido pelo desenvolvedor e qualquer navegador pode ser usado. Isso porque a abordagem REST usa o padrão de chamadas GET, PUT, POST e DELETE. O REST também pode usar objetos XMLHttpRequest (a base do velho AJAX) que a maioria dos navegadores modernos suporta.
Operações totalmente sem-estado: se uma operação precisa ser continuada, o REST não será a melhor opção. No entanto, se forem necessárias operações de CRUD stateless (Criar, Ler, Atualizar e Excluir), o REST seria a melhor alternativa.
Situações que exigem cache: se a informação pode ser armazenada em cache, devido à natureza da operação stateless do REST, esse seria um cenário adequado para a tecnologia.
Essas três situações abrangem muitas soluções. Então por que ainda precisamos considerar o uso do SOAP? Mais uma vez, o SOAP é bastante maduro e bem definido e vem com uma especificação completa. Já a abordagem REST é apenas isso: uma abordagem. Está totalmente aberta. Por isso ao se encontrar uma das situações abaixo, o SOAP pode ser uma ótima solução:
Processamento e chamada assíncronos: se o aplicativo precisa de um nível garantido de confiabilidade e segurança para a troca de mensagens, então o SOAP 1.2 oferece padrões adicionais para esse tipo de operação como por exemplo o WSRM (WS-Reliable Messaging).
Contratos formais: se ambos os lados (fornecedor e consumidor) têm que concordar com o formato de intercâmbio de dados, então o SOAP 1.2 fornece especificações rígidas para esse tipo de interação.
Operações stateful: para o caso de o aplicativo precisar de informação contextual e gerenciamento de estado com coordenação e segurança, o SOAP 1.2 possui uma especificação adicional em sua estrutura que apoia essa necessidade (segurança, transações, coordenação etc.). Comparativamente, usar o REST exigiria que os desenvolvedores construíssem uma solução personalizada.
Como se vê, cada uma das abordagens tem sua utilidade. Ambas têm problemas nos quesitos de segurança, camadas de transporte etc.; mas ambas podem realizar o trabalho necessário e trazem sua contribuição para o desenvolvimento de aplicações web.
Fonte do exemplo apresentado no webinar "A oferta de serviços sob a forma de serviços Webdev: Webservice REST"
Publicado por Jérôme AERTS
http://repository.windev.com
http://repository.windev.com/resource.awp…
RESTSend (Função)
Envia um pedido REST e aguarda a resposta do servidor.
//Exemplo
cMyRequest é restRequest
cMyRequest ..URL = "<server address>"
cMyResponse is restResponse = RESTSend ( cMyRequest )
IF ErrorOccurred THEN
Error ( ErrorInfo ( errFullDetails ))
ELSE
Info ( cMyResponse ..Content)
END
cMyRequest é restRequest
cMyRequest ..URL = "<server address>"
cMyResponse is restResponse = RESTSend ( cMyRequest )
IF ErrorOccurred THEN
Error ( ErrorInfo ( errFullDetails ))
ELSE
Info ( cMyResponse ..Content)
END
http://help.windev.com/en-US/…
RestResponse (tipo Variável)
O RestResponse tipo é usado para definir todas as características avançadas de uma resposta durante o sono. As características desta resposta pode ser definido e modificado por várias propriedades WLanguage.
Nota : Ver declarar uma variável para obter mais detalhes.
//Exemplo
cMyRequest é restRequest
cMyRequest ..URL = "http://www.windev.com"
cMyResponse is restResponse = RESTSend ( cMyRequest )
IF ErrorOccurred THEN
Error ( ErrorInfo ( errFullDetails ))
ELSE
Info ( cMyResponse ..Content)
END
cMyRequest é restRequest
cMyRequest ..URL = "http://www.windev.com"
cMyResponse is restResponse = RESTSend ( cMyRequest )
IF ErrorOccurred THEN
Error ( ErrorInfo ( errFullDetails ))
ELSE
Info ( cMyResponse ..Content)
END
http://help.windev.com/en-US/…
restRequest (Tipo de variável)
O restRequest tipo é usado para definir as características avançadas de um pedido REST. As características do presente pedido de resto pode ser definido e modificado por várias propriedades WLanguage.
Nota : Ver declarar uma variável para obter mais detalhes.
//Exemplo
cMyRequest é restRequest
cMyRequest ..URL = "http://www.windev.com"
cMyResponse is restResponse = RESTSend ( cMyRequest )
IF ErrorOccurred THEN
Error ( ErrorInfo ( errFullDetails ))
ELSE
Info ( cMyResponse ..Content)
END
cMyRequest é restRequest
cMyRequest ..URL = "http://www.windev.com"
cMyResponse is restResponse = RESTSend ( cMyRequest )
IF ErrorOccurred THEN
Error ( ErrorInfo ( errFullDetails ))
ELSE
Info ( cMyResponse ..Content)
END
http://help.windev.com/en-US/…
--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Publicado em maio, 10 2016 - 9:29 PM
|
Prezados,
Aqui o Exemplo do SERVIDOR Webservice REST: Crie um projeto Dynamic Webdev [x] Código da Pagina Principal
//valiáveis globais da página
Procedure MaPage() gsNomDonnées est une chaîne=PageParamètre("nomdonnees") gsID est une chaîne=SansCaractère(PageParamètre("id"),"/") // on supprime le '/' qui est récupéré avec l'Id gsDonnéesARenvoyer est une chaîne ANSI gsStatus est une chaîne gsVerbe est une chaîne gsVerbe=SysEnvironnement("REQUEST_METHOD") // Renvoie REQUEST_METHOD=<verbe> gsVerbe=Remplace(gsVerbe,"REQUEST_METHOD=","") // On conserve uniquement le verbe SELON gsNomDonnées CAS ~="produits" (gsStatus,gsDonnéesARenvoyer)=GestionProduits(gsVerbe,gsID) CAS ~="fournisseurs" gsStatus="404" // non géré pour l'instant AUTRE CAS gsStatus="403" // Forbidden FIN PageEcritEntêteHTTP("Status", gsStatus) ChaîneAffiche(gsDonnéesARenvoyer,"text/json") Procedure GestionProduits
Procedure GestionProduits(pVerbe est une chaîne,pIDRessource est une chaîne)
sStatus est une chaîne sDonnéesàRenvoyer est une chaîne ANSI StProduitSimple est une structure // Description simplifiée d'un produit Reference est une chaîne LibProd est une chaîne <mapping=LibProd> FIN StProduitComplet est une structure // Description complète d'un produit Reference est une chaîne LibProd est une chaîne Description est une chaîne PrixHT est un monétaire Photo est un Buffer <Sérialise=Faux> CodeBarreFabricant est une chaîne FIN SELON pVerbe CAS "GET" // Lecture SI pIDRessource="" ALORS // Renvoie la liste des produits tabProduits est un tableau de StProduitSimple // Transfère le contenu du fichier/table dans un tableau FichierVersTableau(tabProduits,Produit) Sérialise(tabProduits,sDonnéesàRenvoyer,psdJSON) // On peut aussi utiliser sDonnéesàRenvoyer=VariantVersJSON(tabProduits) sStatus="200" // OK SINON // Renvoie le détail d'un produit HLitRecherche(Produit,Reference,pIDRessource,hIdentique) SI HTrouve() ALORS ProduitDemandé est un StProduitComplet // Transfère le produit qu'on vient de lire vers la structure FichierVersMémoire(ProduitDemandé,Produit) Sérialise(ProduitDemandé,sDonnéesàRenvoyer,psdJSON) // On peut aussi utiliser sDonnéesàRenvoyer=VariantVersJSON(ProduitDemandé) sStatus="200" // OK SINON // Le produit n'existe pas sStatus="404" // Not Found FIN FIN CAS "POST" // Ajout SI pIDRessource="" ALORS sDonnéesReçues est une chaîne // Produit à ajouter envoyé au format JSON // Récupère le contenu du POST sDonnéesReçues=PageParamètre(paramBuffer) stProduitàAjouter est un StProduitComplet // Vérifie que les données reçues sont compatibles avec la structure attendue QUAND EXCEPTION DANS Désérialise(stProduitàAjouter,sDonnéesReçues,psdJSON) FAIRE sStatus="406" // 406 Not Acceptable SINON // Transfère les données reçues vers un nouveau produit MémoireVersFichier(stProduitàAjouter,Produit) HAjoute(Produit) sStatus="200" // OK FIN SINON // On ne fournit pas un identifiant dans l'URI lors d'un ajout sStatus="405" // 405 Method Not Allowed FIN CAS "PUT" // Modification SI pIDRessource="" ALORS // On doit fournir un identifiant dans l'URI lors d'une modification sStatus="405" // 405 Method Not Allowed SINON // Recherche le produit HLitRecherche(Produit,Reference,pIDRessource,hIdentique) SI HTrouve() ALORS sDonnéesReçues est une chaîne // Produit à modifier envoyé au format JSON // Récupère le contenu du POST sDonnéesReçues=PageParamètre(paramBuffer) stProduitàAjouter est un StProduitComplet // Vérifie que les données reçues sont compatibles avec la structure attendue QUAND EXCEPTION DANS Désérialise(stProduitàAjouter,sDonnéesReçues,psdJSON) FAIRE sStatus="406" // 406 Not Acceptable SINON // Transfère les données reçues vers le produit MémoireVersFichier(stProduitàAjouter,Produit) HModifie(Produit) sStatus="200" // OK FIN SINON // Le produit n'existe pas sStatus="404" // Not Found FIN FIN CAS "DELETE" // Suppression SI pIDRessource="" ALORS // On doit fournir un identifiant dans l'URI lors d'une suppression sStatus="405" // 405 Method Not Allowed SINON // Recherche le produit HLitRecherche(Produit,Reference,pIDRessource,hIdentique) SI HTrouve() ALORS HSupprime(Produit) sStatus="200" // OK SINON // Le produit n'existe pas sStatus="404" // Not Found FIN FIN AUTRE CAS sStatus="403" // Forbidden FIN RENVOYER(sStatus,sDonnéesàRenvoyer) RETOQUE FINAL Definir os paramentros de execucao da procedure REST Menu Project, opção: Referencing - item: Configure the URL Rewriting Adicione esses parametros OK Simples assim, esta feito um Webservice REST, bem diferente do Webservice SOAP que vai um XML dentro do Envelope SOAP Espero que tenham entendido, esse material foi produzido pelo Sales Manager sr Jerome Aerts da Pcsoft. -- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 9949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/
Mensagem modificada, maio, 10 2016 - 10:22 PM
|
Prezados,
Aqui o Exemplo do Servidor Webservice REST:
Crie um projeto WINDEV DESKTOP STANDALONE 32 BITS = CLIENTE DO WEBSERVICE ACIMA
TELA:
GLOBAL EMBED AO ABRIR A JANELA:
Procedure MaFenêtre()
StProduitSimple est une structure // Description simplifiée d'un produit
Reference est une chaîne
LibProd est une chaîne
FIN
StProduitComplet est une structure // Description complète d'un produit
Reference est une chaîne
LibProd est une chaîne
Description est une chaîne
PrixHT est un monétaire
Photo est un Buffer <Sérialise=Faux>
CodeBarreFabricant est une chaîne
FIN
gtabListeProduit est tableau de StProduitSimple
gDétailProduit est un StProduitComplet
MaFenêtre..Plan=1
StProduitSimple est une structure // Description simplifiée d'un produit
Reference est une chaîne
LibProd est une chaîne
FIN
StProduitComplet est une structure // Description complète d'un produit
Reference est une chaîne
LibProd est une chaîne
Description est une chaîne
PrixHT est un monétaire
Photo est un Buffer <Sérialise=Faux>
CodeBarreFabricant est une chaîne
FIN
gtabListeProduit est tableau de StProduitSimple
gDétailProduit est un StProduitComplet
MaFenêtre..Plan=1
BOTAO CONSULTAR
DemandeListeProduits est un restRequête
RecupèreListeProduits est un restRéponse
DemandeListeProduits.URL="http://localhost/api/produits.awp"
DemandeListeProduits.Méthode=httpGet
RecupèreListeProduits=RESTEnvoie(DemandeListeProduits)
QUAND EXCEPTION DANS
Désérialise(gtabListeProduit,RecupèreListeProduits.Contenu,psdJSON)
FAIRE
Erreur("Incompatibilité dans le format récupéré")
SINON
TableAffiche(TABLE_Produits,taInit)
Message(RecupèreListeProduits.CodeEtat)
FIN
RecupèreListeProduits est un restRéponse
DemandeListeProduits.URL="http://localhost/api/produits.awp"
DemandeListeProduits.Méthode=httpGet
RecupèreListeProduits=RESTEnvoie(DemandeListeProduits)
QUAND EXCEPTION DANS
Désérialise(gtabListeProduit,RecupèreListeProduits.Contenu,psdJSON)
FAIRE
Erreur("Incompatibilité dans le format récupéré")
SINON
TableAffiche(TABLE_Produits,taInit)
Message(RecupèreListeProduits.CodeEtat)
FIN
BOTAO >>
MaFenêtre..Plan++
Simples assim, esta feito um Cliente que vai consumir um Webservice REST, bem diferente do Webservice SOAP que vai um XML dentro do Envelope SOAP, sendo necessário a leitura das tags Xml.
Espero que tenham entendido, esse material foi produzido pelo Sales Manager sr Jerome Aerts da Pcsoft.
FONTE PARA DOWNLOAD
http://repository.windev.com/resource.awp…
VIDEO EXPLICATIVO
--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Mensagem modificada, maio, 10
Nenhum comentário:
Postar um comentário