Escolar Documentos
Profissional Documentos
Cultura Documentos
T UTORIAIS PARA O
DESENVOLVIMENTO DE
W EB SERVICES SOAP
E REST FUL
Na plataforma .NET
Mauricio Cirelli
Abril de 2009
SOAP
Vamos utilizar o Visual Studio 2008 Professional como ferramenta para construção de
nosso WebService.
Primeiramente, devemos abrir o Visual Studio 2008 e criar um novo projeto usando C#.
Selecione ASP.NET WebService Application, como na figura abaixo:
Você será redirecionado para uma tela onde poderá observar o código padrão de seu
WebService. Ao lado direito, no Solution Explorer, você encontrará todos os arquivos da
sua Solução.
Seu serviço chama-se Service1, vamos mantê-lo para facilitar. Caso deseje alterar, você terá
que modificar o nome da Classe criada automaticamente e terá que alterar todas as
referências deste Serviço nos arquivos de projeto, como o web.config.
Além disto, o Visual Studio criou um WebMethod para a função HelloWorld();. Vamos
adicionar um novo WebMethod ao nosso programa:
[WebMethod]
public double Soma(double a, double b)
{
return a + b;
}
Um WebMethod é uma função do WebService que será chamada pelos clients. Veremos
mais adiante como fazemos para que um programa client utilize esta função e trate os
valores recebidos. No caso, a função Soma() recebe dois valores do tipo double e retorna a
soma deles.
Abril de 2009
Pronto, nosso WebService está completo. Vamos criar agora um programa (Windows
Application) que se relaciona com este WebService.
Antes disto, devemos publicar nosso WebService, pois ele não teria utilidade alguma se
ficasse preso ao localhost em determinada porta aleatória criada pelo Visual Studio.
Para isso, compile seu projeto e salve todos os arquivos. Vamos atualizar nosso IIS
(Internet Information Services) adicionando o conteúdo da pasta Meus Documentos/Visual
Studio 2008/Projects/TutorialWebService/ , ou a pasta escolhida para você para o projeto,
em um WebSite na pasta C:/Inetpub/wwwroot/TutorialWebServices/. Será necessário criar
esta pasta.
Abra o IIS em Iniciar > Painel de Controle > Ferramentas Administrativas > Internet
Information Services. Expanda a guia Sites da Web > WebSite Padrão. Crie um novo
Diretório Virtual, chamado TutorialWebServices, como nas figuras abaixo:
Especifique o local de origem (criado acima) e ative todas as opções (Execução, Procura,
Gravação e Leitura) e finalize.
Nesta tela, você poderá testar suas funções (WebMethods) criados. Basta clicar em um dos
links (Soma ou HelloWorld).
Agora que já criamos nosso Webservice e o publicamos, devemos criar uma aplicação que
o utilize de alguma maneira.
Volte ao Visual Studio 2008. Na guia Solution Explorer, clique com botão direito e
adicione um novo Projeto (Add > New Project). Escolha a opção Windows Application e dê
o nome de UsarWebServices.
Um formulário
foi criado e novos arquivos adicionados junto ao novo projeto. Adicione um botão
(CalcularButton) e 2 TextBox (Num1TextBox e Num2TextBox). Adicione outro botão
(HelloWorldButton), pois vamos aproveitar para testar o WebMethod padrão criado
anteriormente.
Com nosso formulário pronto, devemos criar a referência ao nosso WebService. Desta
maneira, poderemos utilizar seus objetos e WebMethods como se fossem funções internas
ao nosso programa.
Para isto, clique com botão direito do mouse no projeto UsarWebService, na Solution
Explorer. Procure Add > Service Reference. Procure o botão Advanced e, na guia que se
abrir, clique no botão Add Web Reference. Você será redirecionado para uma tela como
esta:
Abril de 2009
Escolha Web Services in this Solution. Nesta tela deverão aparecer os WebServices do
nosso projeto, no caso, Service1. Ao selecioná-lo, veremos seus 2 methods, como
anteriormente quando testamos nosso WebService após publicá-lo.
Nota: Você pode criar aplicações e adicionar referências de quaisquer WebServices que
você tenha acesso. Basta, para isto, saber a URL em que este WebService está hospedado.
O site http://www.webservicex.net/WS/wscatlist.aspx, por exemplo, contém um grande
acervo de WebServices que você pode referenciar em uma aplicação e utilizar seus
WebMethods. No nosso exemplo, seria possível buscar e adicionar nossa referência pelo
endereço: //localhost/TutorialWebServices/.
Agora vamos dar utilidade aos nossos WebMethods criados. Vamos adicionar um evento
ao clique do botão Calcular:
//nosso objeto
MessageBox.Show(MeuWebService.HelloWorld().ToString());
return;
}
Concluído. Nas próximas páginas, iremos nos aprofundar nos WebMethods, criando
funções que recebem e retornam Arrays, Objetos, fazem consultas a bancos de dados, entre
outras funcionalidades. Será importante que você tenha adicionado nossa Web Reference
buscando por WebServices dentro do projeto. Caso contrário, você terá que sempre
atualizar a pasta compartilhada do IIS, atualizando o WebService publicado, com as novas
funções que adicionaremos.
Criaremos agora um exemplo um pouco mais prático. Imagine que você tenha um
formulário de inscrição para vagas de emprego no site de sua empresa. Este formulário
deverá receber muitas informações, como as empresas que o candidato já trabalhou.
Queremos armazenar estes dados em uma String Array e, posteriormente, cadastrá-la em
um banco de dados.
Agora editaremos nossa base de dados adicionando uma nova tabela e alguns campos.
Restringiremos, para efeito de tutorial, que o candidato poderá ter atuado em até quatro
empresas.
Abril de 2009
Após adicionar os campos, clique com botão direito na guia criada para a tabela e salve a
tabela com o nome de empresas. Você terá algo assim ao final:
using System.Data;
using System.Data.SqlClient;
[WebMethod]
public Busca BuscaEscolaPorID(string id)
{
string strSQL;
Abril de 2009
//String SQL
strSQL = "SELECT * FROM tblEscola WHERE IDEscola= '" + id + "'";
}
}
}
Este método realiza uma busca pelos dados de uma dada tabela tblEscola e armazena o
conteúdo de cada campo em um objeto do tipo Busca, cujos atributos correspondem aos
campos da tabela, associados pelo método dataRow. Repare que o método retorna como
resultado TODO o objeto res, do tipo Busca, instanciado.
Para que ele funcione, devemos adicionar esta classe Busca ao código. Vá pelo Solution
Explorer em Add New Item e selecione Class. Dê o nome de Busca e adicione o código:
Agora vamos chamar este método e tratar sua resposta através de nosso form client.
Adicione um campo IDEscolaTextBox e um botão BuscarButton.
Proj.RT.NNN.vv 8
Abril de 2009
resultados =
MeuWebService.BuscaEscolaPorID(IDEscolaTextBox.Text.ToString());
if (resultados.ex != "")
MessageBox.Show("ID: " + resultados.IDEscola + "\nNome: " +
resultados.nomeEscola + "\nCidade: " + resultados.cidadeEscola +
"\nEndereço: " + resultados.enderecoEscola + "\nBairro: " +
resultados.bairroEscola + "\nCEP: " + resultados.CEPEscola, "Resultados da
Busca");
else
MessageBox.Show(resultados.ex.ToString(), "Erro!");
}
Este WebMethod realiza a busca e retorna para o client um objeto do tipo Busca. Este
objeto é público e foi lido pelo client, que armazenou e tratou seus atributos exibindo-os em
uma MessageBox.
Agora que já sabemos criar e utilizar WebServices, trataremos um pouco sobre os conceitos
envolvidos na tecnologia.
Vale ressaltar que esta não é a única maneira de gerar interoperabilidade entre plataformas.
RMI, RPC, Corba, entre outras tecnologias também existem para isto, onde cada uma tem
suas limitações e vantagens.
Proj.RT.NNN.vv 9
Abril de 2009
O SOAP padronizou a estrutura destes arquivos XML, de forma que fosse possível a cada
framework criar suas bibliotecas de interpretação e uso destes dados. Abaixo segue uma
figura que ilustra como esta arquitetura funciona.
Uma delas, com certeza, é o próprio arquivo XML. Por utilizar muitos caracteres especiais
e, usualmente, conter muitas informações, trata-se de um arquivo de tamanho considerável
para ficar sendo transmitido pela rede. Se imaginarmos uma grande aplicação ou um
serviço web de grande popularidade, por exemplo, isto se torna um grande problema, pois
as requisições estarão mais sujeitas a falhas e à lentidão.
Como este XML deve ser escrito está definido em outro arquivo XML, o WSDL (Web
Services Definition Language) que descreve o WebService em questão, fornecendo seus
métodos, quais tipos de parâmetros de entrada e saída ele trata, especifica como acessá-lo e
Abril de 2009
os objetos e métodos disponíveis. Toda esta comunicação pode ser criptografada, por meio
de Certificados de Segurança, para tentar garantir que a informação não seja rastreada por
hackers, por exemplo.
Este arquivo foi criado pela Ariba, IBM e Microsoft e, posteriormente, doado à W3C para
que ficasse livre para utilização pública. Estas especificações podem ser encontradas em:
http://www.w3.org/TR/wsdl.
REST
Criando RESTful WebServices com C# 2008
Requisitos:
Primeiramente, abra o VS2008 e crie um novo projeto de Web Site (ASP.NET Web
Application). Chame o projeto de RESTWebService. Se preferir, remova o arquivo
Default.aspx, pois ele não é necessário (ele seria necessário ao consumir o WebService, se
isto fosse feito por esta solução mesmo, trataremos disto mais adiante).
Proj.RT.NNN.vv 11
Abril de 2009
Nosso WebService fará algo bem básico: Somará 10 a um dado número, no entanto,
devemos salientar que a função (WebMethod) poderá executar qualquer tarefa que uma
aplicação comum pode executar, como consulta a bancos de dados, por exemplo.
namespace RESTWebService
{
/// <summary>
/// Summary description for $codebehindclassname$
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class RESTWS : IHttpHandler
{
int count;
//Executa o serviço apenas se algo foi dado como
entrada;
try
{
count =
Int32.Parse(context.Request.QueryString["num"].ToString());
context.Response.ContentType = "text/plain";
context.Response.Write("Este webservice soma 10 ao
número digitado: \n");
context.Response.Write((count + 10).ToString());
Abril de 2009
}
catch (Exception ex)
//Retorno caso nada tenha sido digitado.
{
context.Response.Write("Uma excessão não tratada foi
encontrada: \n\n");
context.Response.Write("Parâmetro de entrada nulo ou
não é número. \n\n");
context.Response.Write(ex.ToString());
}
Estando habituado ao ambiente Web, podemos querer que nosso WebMethod trate do valor
de alguma Session que esteja aberta. Isto também é possível.
Da mesma forma que isto é uma vantagem, em contrapartida, oferece uma grande
desvantagem: não é possível utilizar o método ProcessRequest com outro tipo diferente de
void. Ou seja, este método não pode retornar valores.
REST postula que devemos trabalhar SEMPRE com os métodos nativos do http (os mais
comuns: GET e POST) e evitar utilizar métodos de APIs complexas como o SOAP faz.
Desta maneira o código fica mais claro.
Outro motivo, já mencionado, é sua interação óbvia com páginas web. Como ele realiza sua
comunicação através de métodos nativos do http, podemos realizar chamadas e tratá-las
através de formulários HTML (ou, AJAX/JSON), de forma que todo o processo se torne
independente de plataforma, reconhecido por todos os browsers e tratado da maneira mais
conveniente para os WebDesigners e programadores.
É possível tratar de valores de variáveis e objetos restritos ao ambiente Web, como strings
de formulários e sessões de usuários, bem como Cookies.
REST impõe uma troca de informações mais simples, deixando sua aplicação mais rápida e
menos sujeita a erros de interpretação por parte das aplicações.
Proj.RT.NNN.vv 13
Abril de 2009
Limitações do REST:
Como a comunicação é feita somente através dos métodos POST e GET, ou seja, troca de
strings, não é possível enviar ou receber objetos complexos, como imagens, arrays ou
objetos de classes criadas pelas aplicações envolvidas de forma direta. Um Webservice
baseado na arquitetura REST deverá receber uma string de entrada e tratá-la de forma a
retornar valores que uma página web apresentaria.
Ou seja, é necessário criar WebMethods mais complexos para atender estes requisitos.
Esta é a parte mais simples. Para consumir um RESTful WebService, devemos apenas criar
um formulário HTML com o parâmetro action definido para o WebService.ashx, utilizando
o method no qual o WebService foi projeto.
Referência Bibliográfica:
http://msdn.microsoft.com/en-us/netframework/cc950529.aspx
Proj.RT.NNN.vv 14