WebServices
Domingo, 22 dUTC Junho dUTC 2008
Webservices
Nunca me preocupei muito com WebServices, mas devido a uma necessidade no meu trabalho tive que aprender, então resolvi escrever uma alguma coisa relacionada baseado no textos e exemplos que encontrei na internet, não sei ainda quantos artigos vou escrever mas nesse primeiro vou dar uma rápida pincelada no o que é um WebService, pretendo ainda postar em um próximo artigo um exemplo prático de utilização de WebServices com o Delphi e se houver inspiração suficiente mais um artigo demonstrando a criação de WebServices.
WebServices são tidos como uma importante evolução na construção de aplicações distribuídas, mas afinal o que é um WebService?
Muito se discute sobre a exata definição de WebService, de qualquer maneira, no mínimo um WebService é um software disponibilizado via internet e que usa como sistema de mensagens um XML padronizado. Esse XML é usado para codificar toda a comunicação com o WebService. Por exemplo o cliente envia um XML para o WebService e recebe como resposta outro XML. Como toda a comunicação é feita via XML um webservice não está atrelado a nenhuma linguagem de programação ou sistema operacional, o que significa que um WebService feito em Java e compilado em Linux pode ser acessado facilmente por uma aplicalção Delphi no Windows.
Além dessa definição um WebService tem duas propriedades desejáveis:
1. Um WebService pode ter um interface pública, definida em XML. Essa interface descreve todos os métodos disponíveis e suas respectivas assinaturas. Atualmente a definição dessa interface é feita através do WSDL (Web Service Description Language), ou linguagem de descrição de webservices.
2. Se você criou um WebService deve haver algum mecanismo para que você torne este WebService público. Da mesma maneira deve haver algum modo de se localizar um WebService quando há a necessidade. Isso atualmente é feito através do UDDI (Universal Description, Discovery, and Integration).
Então, simplificando a diferença entre os Webservices e s chamadas RPC que eram usadas anteriormente para aplicações distribuídas é o XML. O XML é o coração dos WebServices, antes dele era possível a integração entre aplicações, porém a sua utilização padronizada facilitou em muito essa integração.
Atualmente há webservices para quase todo tipo de tarefa, desde pesquisa de clima, consulta de tempo, validação de cartão de crédito, etc.. Para uma rápida consulta a alguns web services existentes acesse http://www.xmethods.net/.
A pilha de protocolos para um WebService funciona da seguinte maneira:
1. Transporte. Esta camada é responsável por levar a comunicação do cliente ao WebService e vice-versa, e usa mais comumente os seguintes protocolos: HTTP, FTP,e SMTP.
2. Mensagem XML. Esta camada é responsável por codificar a comunicação de modo que ela possa ser compreendida pelas duas pontas. E atualmente os padrões utilizados são o XML-RPC e o SOAP.
3. Descrição. Esta camada descreve a interface pública de um WebService e utiliza WSDL.
4. Serviço de Descoberta. Responsável por centralizar o registro, publicação e busca de WebServices, é atualmente feita via UDDI.
Felizmente não é necessário saber esses protocolos todos ( e nem todos os outros que podem ser utilizados, como WSFL, SOAP-DSIG, USML, e outros, ufa que sopa de letrinhas rsrs… ). Levando em conta que você já sabe o básico do HTTP aprender XML é a melhor maneira de começar.
Atualmente dois padrões são os mais utilizados para a comunicação de WebServices:
1. XML-RPC é um protocolo que utiliza XML para efetuar chamadas remotas (RPC), as solicitações são codificadas em XML e envida via HTTP POST, e o XML de resposta e embutido no corpo da mensagem HTTP. Segue um exemplo das mensagens XML-RPC para um serviço de previsão do tempo.
Requisição:
<?xml version="1.0" encoding="ISO-8859-1"?> <methodCall> <methodName>weather.getWeather</methodName> <params> <param><value>10016</value></param> </params> </methodCall>
Resposta:
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value><int>65</int></value>
</param>
</params>
</methodResponse>
2. SOAP assim como o XML-RPC é independente de plataforma, e embora possa ser utilizados em vários sitemas de mensagem é mais comumente utilizado para chamadas remotas (RPC) sobre HTTP. Segue um exemplo das mensagens XML-RPC para um serviço de previsão do tempo.
Requisicao:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getWeather
xmlns:ns1="urn:examples:weatherservice"
SOAP-ENV:encodingStyle=" http://www.w3.org/2001/09/soap-encoding
<zipcode xsi:type="xsd:string">10016</zipcode>
</ns1:getWeather>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Resposta:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelopexmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getWeatherResponse
xmlns:ns1="urn:examples:weatherservice"
SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap-encoding">
<return xsi:type="xsd:int">65</return>
</ns1:getWeatherResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Note que o a construção do XML para o SOAP é mais complexa que para o XML-RPC e utiliza namespaces e XML Schemas.
Segue abaixo um exemplo da utilização do WSDL para a descrição de um serviço, vale lembra que uma interface pública pode conter o seguinte:
1. Informação sobre todas as funções disponíveis publicamente;
2. Informação sobre o tipo de Dados para todas as mensagens XML;
3. Informação sobre o protocolo de transporte a ser utilizado;
4. E, Informação sobre a localização do serviço.
Note ainda no XML duas coisas, o elemento <message> que define as mensagens relativas ao serviço, neste caso “getWeatherRequest” e “getWeatherResponse”, e também o elemento <service> que especifica que o serviço e está disponível através de SOAP e sua localização.
WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="WeatherService"
targetNamespace="http://www.site_com_o_servico.com/wsdl/WeatherService.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.site_com_o_servico.com/wsdl/WeatherService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="getWeatherRequest">
<part name="zipcode" type="xsd:string"/>
</message>
<message name="getWeatherResponse">
<part name="temperature" type="xsd:int"/>
</message>
<portType name="Weather_PortType">
<operation name="getWeather">
<input message="tns:getWeatherRequest"/>
<output message="tns:getWeatherResponse"/>
</operation>
</portType>
<binding name="Weather_Binding" type="tns:Weather_PortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getWeather">
<soap:operation soapAction=""/>
<input>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:weatherservice"
use="encoded"/>
</input>
<output>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:weatherservice"
use="encoded"/>
</output>
</operation>
</binding>
<service name="Weather_Service">
<documentation>WSDL File for Weather Service</documentation>
<port binding="tns:Weather_Binding" name="Weather_Port">
<soap:address
location="http://localhost:8080/soap/servlet/rpcrouter"/>
</port>
</service>
</definitions>