Dev (Back & Front)ARTIGO

Criando Web Services

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 Class

Observe 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 Function

A 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… 

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil