segunda-feira, 1 de dezembro de 2014

WSDL – O que é? Pra que serve?


Fonte: http://fabriciosanchez.com.br/2/wsdl-o-que-e-pra-que-serve-onde-utilizo/

RPC – Remote Procedure Calls
RPC (em português, chamada de procedimentos remotos) é um modelo que define a forma como são realizadas as chamadas a operações remotas através de web services.
O modelo descreve o funcionamento de chamadas remotas, de forma semelhante a chamada de procedimentos locais. Assim, a diferença fundamental de um modelo em relação ao outro consiste no fato de que, no modelo descrito pelo RPC, temos a presença marcante de duas figuras trabalhando ativamente: o cliente e o servidor.
Basicamente, no modelo RPC tem-se uma thread responsável por gerir o processo de requisição e resposta, que funciona da seguinte forma:
  1. O processo invocador (A) faz uma requisição ao processo servidor (B). Enquanto esta resposta não é devolvida com todos os parâmetros, o processo A aguarda bloqueado (ou seja, nenhuma outra operação pode ser realizada por A). A mensagem enviada por A, possui toda parametrização necessária para a execução da mesma e posterior resposta por parte de B.
  2. O processo B recebe a solicitação, extrai os dados, processa a mesma e produz os resultados e devolve a resposta para A. Vale notar que, assim que a resposta foi despachada, B volta a esperar por uma nova requisição.
Neste modelo de comunicação, apenas um processo permanece ativo em determinado instante de tempo. Variações do modelo RPC, permitem a comunicação assíncrona, mas este é um assunto para outro post. A Figura 1 apresenta o modelo de comunicação RPC.
Figura 1: O modelo RPC de comunicação inter-processos
WSDL – O que é?
WSDL é um documento proposto pela W3C a partir de Junho de 2007 escrito em XML que visa padronizar as descrições das funcionalidades ofereridas por web services de forma independente de plataforma ou linguagem. Possui basicamente duas finalidades:
  1. Expor os  métodos que determinado serviço disponibilizará
  2. Possibilitar a localização de determinado serviço
Como mencionado anteriormente, WSDL é escrito em XML, portanto, para que se possa elaborá-lo, é preciso acumular alguns conhecimentos, tais como: XML Namespaces, XML Schemas, etc.
Outro conceito importante relacionado a WSDL é o fato de que ele trabalha em parceria com outras duas tecnologias, sendo elas: UDDI e SOAP. Em posts futuros, trataremos destes dois assuntos com maiores detalhes. Por hora, basta mencionar que enquanto WSDL apresenta os recursos disponíveis, UDDI permite a publicação do serviço e SOAP possibilita o tráfego das informações.
WSDL – Elementos básicos
Como mencionado anteriormente, WSDL é um documento XML simples que descreve através de elementos específicos, a estrutura dos serviços web. Assim, sua estrutura é extremamente simplificada. A seguir apresentamos os principais elementos descritivos de um documento WSDL.
  • <types>: aqui deverão ser descritos os tipos de dados suportados pelo serviço em questão
  • <message>: aqui devem ser especificados os padrões de entrada e saída de dados dos web services
  • <portType>: aqui devem ser descritos os agrupamentos lógicos das operações. São as operações executadas pelo web service
  • <binding>: aqui devem ser apresentados os protocolos de comunicação que os web services utilizam
  • <operation>: região que permite a especificação das assinaturas dos métodos disponibilizados
  • <definitions>: elemento padrão de todos os documentos WSDL. Permite efetuar descrições sobre schemas enamespaces
Mais adiante neste post, analisaremos um arquivo WSDL pronto para que possamos entender em nível prático como se dá a construção do mesmo.
WSDL – Namespaces
Se você trabalha com C#, por exemplo, já está acostumado com o conceito de namespaces. Para arquivos WSDL, a ideia é rigorosamente a mesma, isto é, os conceitos de reaproveitamento e organização de códigos são implementados também. A seguir, apresentamos os principais namespaces já disponíveis para WSDL.
  • http://schemas.xmlsoap.org/wsdlnamespace de WSDL
  • http://schemas.xmlsoap.org/wsdl/soapnamespace que permite a utilização de WSDL com SOAP
  • http://schemas.xmlsoap.org/wsdl/httpnamespace que permite HTTP, GET e POST
  • http://schemas.xmlsoap.org/wsdl/mimenamespace que permite a vinculação de MIME aos WSDLs
  • http://schemas.xmlsoap.org/soap/encodingnamespace que permite a codificação segundo padrão SOAP
  • http://schemas.xmlsoap.org/soap/envelopenamespace que permite a codificação segundo padrão SOAP 1.1
  • http://www.w3.org/2001/XMLSchema-instancenamespace de instância definido pelo padrão XML
  • http://www.w3.org/2001/XMLShemanamespace de schemas definido conforme regras do XML
Sobre o exemplo deste post
Agora que já fomos apresentados aos conceitos fundamentais sobre WSDL, podemos estruturar um arquivo para que possamos aplicar os conceitos de forma satisfatória.
Basicamente existem duas formas para escrever arquivos WSDL, sendo que, a forma escolhida impacta também na forma como a associação com o serviço é realizada. As formas as quais nos referimos são: manual (onde o arquivo WSDL é estruturado manualmente pelo desenvolvedor) e automática (gerado pela ferramenta onde o o serviço é criado). Se você optar por criar um serviço utilizando Visual Studio 2010 e WCF, por exemplo, o arquivo WSDL vai sendo gerado a medida que o serviço é estruturado.
O que faremos é criar um serviço de disponibiliza um método que reajusta o salário informado de acordo com uma faixa salarial fictícia.
Criando o web service
Para criar o serviço, utilizarei o Mono Develop, entretanto, você pode utilizar o Visual Studio ou outra ferramenta qualquer de desenvolvimento que será possível obter o mesmo resultado. A Listagem 1 apresenta o código doweb service.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%@ WebService Language="C#" Class="WebServiceReajusteDeSalario.WSReajusteSalario" %>
 
using System;
using System.Web.Services;
 
namespace WebServiceReajusteDeSalario
{
 
public class WSReajusteSalario : System.Web.Services.WebService
{
[WebMethod]
public string CalculaReajusteSalario(string pSalario)
{
string SalarioFormatado = pSalario.Replace(",",".");
if(SalarioFormatado == "" || SalarioFormatado == string.Empty || SalarioFormatado == null)
{
return "Erro ao tentar calcular o reajuste!";
}
else
{
double dSalario = Convert.ToDouble(SalarioFormatado);
if(dSalario >=0 && dSalario <=600.0)
{
dSalario *= 1.8;
return Convert.ToString(dSalario);
}
else if(dSalario >= 601.0 && dSalario <= 1000.0)
{
dSalario *= 1.5;
return Convert.ToString(dSalario);
}
else
{
dSalario *= 1.2;
return Convert.ToString(dSalario);
}
}
}
 
}
}
Listagem 1: Serviço que calcula o reajuste de salário
O código do serviço é simples e dispensa maiores comentários. Como estamos criando um serviço ASMX, estamos trabalhando com o protocolo SOAP no encapsulamento das informações trafegadas e, portanto, precisamos de um arquivo WSDL para apresentar a descrição do serviço. A Listagem 2 apresenta o código do arquivo gerado pelo Mono Develop para o serviço em questão.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:s0="http://tempuri.org/"
name="WSReajusteSalario" targetNamespace="http://tempuri.org/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<xs:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="CalculaReajusteSalario">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="pSalario" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CalculaReajusteSalarioResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="CalculaReajusteSalarioResult"
type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="string" nillable="true" type="xs:string"/>
</xs:schema>
</types>
<message name="CalculaReajusteSalarioSoapIn">
<part name="parameters" element="s0:CalculaReajusteSalario"/>
</message>
<message name="CalculaReajusteSalarioSoapOut">
<part name="parameters" element="s0:CalculaReajusteSalarioResponse"/>
</message>
<message name="CalculaReajusteSalarioHttpGetIn">
<part name="pSalario" type="s:string"/>
</message>
<message name="CalculaReajusteSalarioHttpGetOut">
<part name="Body" element="s0:string"/>
</message>
<message name="CalculaReajusteSalarioHttpPostIn">
<part name="pSalario" type="s:string"/>
</message>
<message name="CalculaReajusteSalarioHttpPostOut">
<part name="Body" element="s0:string"/>
</message>
<portType name="WSReajusteSalarioSoap">
<operation name="CalculaReajusteSalario">
<input message="s0:CalculaReajusteSalarioSoapIn"/>
<output message="s0:CalculaReajusteSalarioSoapOut"/>
</operation>
</portType>
<portType name="WSReajusteSalarioSoap12">
<operation name="CalculaReajusteSalario">
<input message="s0:CalculaReajusteSalarioSoapIn"/>
<output message="s0:CalculaReajusteSalarioSoapOut"/>
</operation>
</portType>
<portType name="WSReajusteSalarioHttpGet">
<operation name="CalculaReajusteSalario">
<input message="s0:CalculaReajusteSalarioHttpGetIn"/>
<output message="s0:CalculaReajusteSalarioHttpGetOut"/>
</operation>
</portType>
<portType name="WSReajusteSalarioHttpPost">
<operation name="CalculaReajusteSalario">
<input message="s0:CalculaReajusteSalarioHttpPostIn"/>
<output message="s0:CalculaReajusteSalarioHttpPostOut"/>
</operation>
</portType>
<binding name="WSReajusteSalarioSoap" type="s0:WSReajusteSalarioSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="CalculaReajusteSalario">
<soap:operation soapAction="http://tempuri.org/CalculaReajusteSalario" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<binding name="WSReajusteSalarioSoap12" type="s0:WSReajusteSalarioSoap12">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="CalculaReajusteSalario">
<soap12:operation soapAction="http://tempuri.org/CalculaReajusteSalario"
style="document"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
</binding>
<binding name="WSReajusteSalarioHttpGet" type="s0:WSReajusteSalarioHttpGet">
<http:binding verb="GET"/>
<operation name="CalculaReajusteSalario">
<http:operation location="/CalculaReajusteSalario"/>
<input>
<http:urlEncoded/>
</input>
<output>
<mime:mimeXml part="Body"/>
</output>
</operation>
</binding>
<binding name="WSReajusteSalarioHttpPost" type="s0:WSReajusteSalarioHttpPost">
<http:binding verb="POST"/>
<operation name="CalculaReajusteSalario">
<http:operation location="/CalculaReajusteSalario"/>
<input>
<mime:content type="application/x-www-form-urlencoded"/>
</input>
<output>
<mime:mimeXml part="Body"/>
</output>
</operation>
</binding>
<service name="WSReajusteSalario">
<port name="WSReajusteSalarioSoap" binding="s0:WSReajusteSalarioSoap">
<soap:address location="http://127.0.0.1:8080/WSReajusteSalario.asmx"/>
</port>
<port name="WSReajusteSalarioSoap12" binding="s0:WSReajusteSalarioSoap12">
<soap12:address location="http://127.0.0.1:8080/WSReajusteSalario.asmx"/>
</port>
<port name="WSReajusteSalarioHttpGet" binding="s0:WSReajusteSalarioHttpGet">
<http:address location="http://127.0.0.1:8080/WSReajusteSalario.asmx"/>
</port>
<port name="WSReajusteSalarioHttpPost" binding="s0:WSReajusteSalarioHttpPost">
<http:address location="http://127.0.0.1:8080/WSReajusteSalario.asmx"/>
</port>
</service>
</definitions>
Listagem 2: Código do arquivo WSDL criado
Como é possível observar, o arquivo WSDL possui todas as informações sobre o serviço criado, tais como: nome, encode, descrição do método disponível, MIME, etc., e tudo isso, em um formato extremamente simples – XML. A Figura 2 apresenta o serviço criado em funcionamento.
Figura 2: Serviço em execução
Bom pessoal, por hoje é isso. Espero que este post possa tê-lo ajudado a entender o conceito relacionado aos arquivos WSDL e sua importância no conexto da comunicação de aplicações.

Nenhum comentário:

Postar um comentário