Os Web services surgiram com uma promessa de
revolucionar a forma como a informação é compartilhada. Eles fornecem uma forma
padrão e universal de intercambiar informações de uma maneira simples;
são componentes que permitem às aplicações enviar e receber dados em formato
XML.
Os Web services podem ser vistos
como aplicações modulares que podem ser descritas, publicadas,
localizadas e invocadas sobre o protocolo padrão da Internet
usando mensagens XML padronizadas; as aplicações usam como base
o XML SOAP para troca de informação onde o
ambiente de distribuição das aplicações postadas na web são
descritas através do WSDL – Web Service
Description Language – e são registrados com um registro de
serviço privado ou público usando o padrão UDDI,
tal como http://uddi.microsoft.com ou http://uddi.ibm.com.
SOAP
(originado do acrônimo inglês Simple Object Access
Protocol) é um protocolo para troca de informações
estruturadas em uma plataforma descentralizada e distribuída,
utilizando tecnologias baseadas em XML. Sua especificação
define um framework que provê maneiras para se construir
mensagens que podem trafegar através de diversos
protocolos e que foi especificado de forma a ser
independente de qualquer modelo de programação ou outra
implementação específica. Por não se tratar de um
protocolo de acesso a objetos, o acrônimo não é mais
utilizado.
Geralmente servidores SOAP são implementados
utilizando-se servidores HTTP, embora isto não seja uma
restrição para funcionamento do protocolo. As mensagens
SOAP são documentos XML que aderem a uma especificação
fornecida pelo órgão W3C.
O primeiro esforço do desenvolvimento do SOAP foi
implementar RPCs sobre XML.(http://pt.wikipedia.org/wiki/SOAP)
Os Web Services usam
basicamente o protocolo HTTP (Hypertext
Transfer Protocol) e SOAP para tornar informações
disponíveis na web. Eles expõem objetos de negócio para
chamadas SOAP através de HTTP e executam
chamadas de funções remotas. Os consumidores dos web services
estão aptos a invocar as chamadas de métodos no objetos remotos
usando SOAP e HTTP.

O
Web Services Definition Language (WSDL) é uma linguagem
baseada em XML
utilizada para descrever
Web Services. Trata-se de um documento escrito em
XML que, além
de descrever o serviço, especifica como acessá-lo e quais as operações
ou métodos disponíveis.
Foi
submetido ao W3C
por Ariba, IBM
e
Microsoft em março de 2001 sendo que seu primeiro rascunho foi
disponibilizado em julho de 2002.
Nota: Web Service
Enhancements (WSE) 2.0 é um add-on para o Visual Studio que
simplifica o desenvolvimento e a distribuição de web services
seguros. Para detalhes veja: http://msdn.microsoft.com/webservices/webservices/building/wse/default.aspx.
Neste artigo vou me
ater a um enfoque mais prático mostrando como criar e usar os
web services levando em conta alguns cenários usando o
Visual
Web Developer 2008 Express Edition (VWD2008).
Inicie o VWD2008 e crie um novo web site através do
menu File -> New Web Site selecionando o template
ASP .NET Web Service e informando o nome WebService1;
Na janela Solution Explorer você deverá ver
uma pasta App_Code contendo o arquivo code-behind para
o web service, uma pasta App_Data e os arquivos
Service.asmx
e web.config.
No ASP .NET um web service é
constituído de um arquivo .asmx e uma classe
code-behind que fornece a funcionalidade requerida. O conteúdo
do arquivo .asmx é apenas uma linha que contém
a diretiva WebService idêntica a uma diretiva @Page
usada em um arquivo .aspx . No nosso exemplo temos:
<%@ WebService
Language=”vb”
CodeBehind=”~/App_Code/Service.vb”
Class=”Service” %>
O arquivo code-behind Service.vb
da pasta App_Code é uma classe que herda de System.Web.Services.WebService:
Imports System.Web<br />Imports System.Web.Services<br />Imports System.Web.Services.Protocols<br /><br /><em>' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.<br />' <System.Web.Script.Services.ScriptService()> _</em><br /><strong><WebService(Namespace:="http://tempuri.org/")> _<br /><WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _<br /><Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()></strong> _<br />Public Class Service<br /><strong>Inherits System.Web.Services.WebService</strong><br /><br /><strong> <WebMethod()> _</strong><br /> Public Function HelloWorld() As String<br /> Return "Hello World"<br /> End Function<br /><br />End ClassObserve que temos uma atributo WebService
na definição da classe que permite definir o namespace para o
web service. Por padrão o namespace é definido para http://tempuri.org/ mas você pode alterar para uma URI
representando sua empresa.
<_WebService(Namespace:=”http://tempuri.org/”)>
_
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
_
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Além disso, existe um
atributo WebServiceBinding que indica que o web
service está em conformidade com a especificação WS-I BP 1.1 –
Web Services Interoperability Basic Profile specification (veja
detalhes em http://www.ws-i.org).
Até este momento, embora o web
service criado seja perfeitamente funcional, ele é não faz nada
de realmente útil.
Para incluir uma funcionalidade ao
web service devemos criar métodos como fazermos em uma classe
comum; a exceção é que precedemos cada definição de método
com o atributo WebMethod que informa que o
método deve ser exposto como um web service.
Neste nosso primeiro exemplo eu vou
criar um método para acessar um banco de dados e retornar
informações de uma tabela. Vou usar o banco de dados
Northwind.mdf e acessar a tabela Products,
isso será feito através do método getProdutos.
Obs: Você
pode obter o banco de dados de exemplo Northwind.mdf neste link:
Northwind
No arquivo service.vb
vamos substituir o método HelloWorld pelo
método getProdutos() conforme o código abaixo:
Primeiro declare os namespaces
usados para acessar o SQL Server e pode acessar a string de
conexão no arquivo web.config:
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Em seguida defina o seguinte código
para o método getProdutos():
<WebMethod()> _<br /> Function getProdutos(ByVal produtos As Integer) As DataSet<br /> 'define as variáveis objetos usadas <br /> Dim conexaoBD As SqlConnection = Nothing<br /> Dim da As SqlDataAdapter = Nothing<br /> Dim ds As DataSet = Nothing<br /> Dim cmd As String<br /> Dim sql As String<br /><br /> Try<br /> 'Obtem a string de conexão do web.config <br /> 'abre a conexao com o banco de dados<br /> cmd = ConfigurationManager.ConnectionStrings("conexaoNorthwind").ConnectionString<br /> conexaoBD = New SqlConnection(cmd)<br /> conexaoBD.Open()<br /><br /> 'monta a instrução SQL para obter os dados da tabela Products<br /> sql = "SELECT Top " & produtos.ToString() & " " & _<br /> "ProductID, ProductName, UnitPrice " & _<br /> "FROM Products " & _<br /> "ORDER BY ProductName"<br /><br /> 'cria um novo dataset <br /> 'preenche o dataset com produtos<br /> ds = New DataSet<br /> da = New SqlDataAdapter(sql, conexaoBD)<br /> da.Fill(ds)<br /><br /> 'retorna a lista de produtos<br /> Return (ds)<br /><br /> Finally<br /> 'libera objetos da memória<br /> If (Not IsNothing(conexaoBD)) Then<br /> conexaoBD.Close()<br /> End If<br /> End Try<br /> End FunctionA string de conexão deverá estar
definida no arquivo web.config conforme o código abaixo:
Obs:
Eu estou usando o SQL Server 2005 Express Edition na minha
máquina local.
<br /> ....<br /> <appSettings/><br /> <connectionStrings><br /> <add name="<strong>conexaoNorthwind</strong>" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True" _<br /> providerName="System.Data.SqlClient"/><br /> </connectionStrings><br /> ....O método getProdutos()
recebe como parâmetro o número de produtos e consulta o
banco de dados Northwind retornando uma lista de produtos em um
dataset. Toda a infraestrutura de suporte ao web service como a
criação do XML e do SOAP usado para tranferir os dados para o
cliente é feito de forma transparente pela plataforma .NET.
Neste momento já
podemos testar o web service no VWD2008 rodando o projeto. Ao
fazer isso será aberta uma página ASP .NET exibindo uma
relação com todos os métodos expostos pelo web service. No
nosso caso temos apenas o método getProdutos:

Ao clicar no método
getProdutos() será exibida outra página, veja abaixo,
onde você deve informar um valor que representa o parâmetro produtos
e especifica a quantidade de livros sobre o qual desejamos obter
informações.

Após fazer isso e clicar no botão invoke
será executado o método do webservice.
A ASP .NET gera uma requisição Get HTTP e submete-a ao web service. O web service
responde com um reponse
Http contendo os dados
requisitados. No nosso exemplo será retornado o XML (mostrado
na figura abaixo) a partir do web service exibindo os campos ProductID,
ProductName, UnitPrice para a quantidade de produtos
especificada no parâmetro produtos.

O arquivo XML completo gerado é
exibido a seguir:
<?xml version="1.0" encoding="utf-8"?><br /><DataSet xmlns="http://tempuri.org/"><br /><br /><xs:schema id="NewDataSet" xmlns=""<br />xmlns:xs="http://www.w3.org/2001/XMLSchema"<br />xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><br /> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><br /> <xs:complexType><br /> <xs:choice minOccurs="0" maxOccurs="unbounded"><br /> <xs:element name="Table"><br /> <xs:complexType><br /> <xs:sequence><br /><strong> <xs:element name="ProductID" type="xs:int" minOccurs="0" /><br /> <xs:element name="ProductName" type="xs:string" minOccurs="0" /><br /> <xs:element name="UnitPrice" type="xs:decimal" minOccurs="0" /></strong><br /> </xs:sequence><br /> </xs:complexType><br /> </xs:element><br /> </xs:choice><br /> </xs:complexType><br /> </xs:element><br /> </xs:schema><br /><br /><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"<br />xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><br /> <NewDataSet xmlns=""><br /> <Table diffgr:id="Table1" msdata:rowOrder="0"><br /> <ProductID>17</ProductID><br /> <ProductName>Alice Mutton</ProductName><br /> <UnitPrice>39.0000</UnitPrice><br /> </Table><br /> <Table diffgr:id="Table2" msdata:rowOrder="1"><br /> <ProductID>3</ProductID><br /> <ProductName>Aniseed Syrup</ProductName><br /> <UnitPrice>10.0000</UnitPrice><br /> </Table><br /> <Table diffgr:id="Table3" msdata:rowOrder="2"><br /> <ProductID>40</ProductID><br /> <ProductName>Boston Crab Meat</ProductName><br /> <UnitPrice>18.4000</UnitPrice><br /> </Table><br /> <Table diffgr:id="Table4" msdata:rowOrder="3"><br /> <ProductID>60</ProductID><br /> <ProductName>Camembert Pierrot</ProductName><br /> <UnitPrice>34.0000</UnitPrice><br /> </Table><br /> <Table diffgr:id="Table5" msdata:rowOrder="4"><br /> <ProductID>18</ProductID><br /> <ProductName>Carnarvon Tigers</ProductName><br /> <UnitPrice>62.5000</UnitPrice><br /> </Table><br /> </NewDataSet><br /> </diffgr:diffgram><br /></DataSet>Sejamos sinceros, é muito fácil
criar web services na plataforma .NET. É claro que existem
muitos outros detalhes que não abordamos neste artigo, mas
aguarde que irei mostrar outros cenários na criação de web
services.
Pegue o projeto completo aqui :
WebService1.zip
Em um próximo artigo, mostrarei como consumir um
web service.
Eu sei, é apenas ASP .NET, mas eu
gosto…








