Mostrando postagens com marcador Webservice. Mostrar todas as postagens
Mostrando postagens com marcador Webservice. Mostrar todas as postagens

sábado, 28 de março de 2009

Ajax-enabled Web Services with ScriptManager

Clique aqui para ver este post em Português

In this post I'll show an incredible ASP.Net feature I've learned recently: Ajax-enabled Web Services.

With the ScriptManager component (that we've already seen in this post) we're able to consume a Web Service in our Web Site and use the results in JavaScript with little to none specific programming effort. With this component, the Web Service looks like it's a client script object.


Let's start with a new Web Site in Visual Studio (the Visual Web Developer express edition works fine, too). Choose a folder to save the Web Site (you don't need the IIS installed in order to test de project). Now we'll create the Web Service.

Right-click the Web Site's root directory and choose Add New Item. In the dialog box select Web Service. Name it AjaxWs.asmx and click Ok. The IDE should open the file App_Code/AjaxWs.cs. This is where we're gonna work.

Let's leave its implementation as it is for now. It should come with a sample method HelloWorld. The only thing we'll do is "enable" the client script calls. To do that find the class definition:

public class AjaxWs : System.Web.Services.WebService


In the line above there's a commented class decoration that we only need to remove the comment bars to enable this feature:

// [System.Web.Script.Services.ScriptService]


So, remove the comment and save the file and click the menu Build > Build Web Site.

The Web Service part is done (for now). Now we're gonna code the Web Form that calls the Web Service. Open the Default.aspx file and go to the visualization "Source" or "Split". Below the form tag

<form id="form1" runat="server">


We're gonna add a ScriptManager component. You can drag it from the toolbox or simply type manually the asp:ScriptManager tag. The VS makes the effort of type the tags manually very smooth, even if it may not seem that way. After done the tag looks like this:

<asp:ScriptManager runat="server" ID="ScriptMngr">
<Services>
<asp:ServiceReference Path="~/AjaxWs.asmx" />
</Services>
</asp:ScriptManager>


We'll now create a client script block in our Web Form. Find the head section and add a script block inside. Here's the code:

<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function executarWs() {
AjaxWs.HelloWorld(
function(resultado) {
alert(resultado)
}
)
}
</script>
</head>


I'll give a brief explanation about this script:

AjaxWs - Our Web Service - was created by VS when we added the ScriptManager component and referenced the ~/AjaxWs.asmx Web Service. We're coding a method call to Hello World and pass a function as an argument - more precisely a callback. A callback is a function definition that is called when the function that took is as an argument needs. Think of it as some sort of event handler. But it's subject for another post.

Now we need to call this method. We've seen "new feature" part. Now we're gonna call our Web Service's methods as an ordinary JavaScript call. We'll create a HTML button to call the JavaScript function:

<button onclick="executarWs()">Clique aqui</button>


Here goes the complete WebForm's code:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function executarWs() {
AjaxWs.HelloWorld(
function(resultado) {
alert(resultado)
}
)
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="ScriptMngr">
<Services>
<asp:ServiceReference Path="~/AjaxWs.asmx" />
</Services>
</asp:ScriptManager>
<div>
<button onclick="executarWs()">Clique aqui</button>
</div>
</form>
</body>
</html>


Now run the Web Site (F5) to see what we've done in action. When we click the button the message "Hello World" will pop up. This alone is very nice already; but, what if we could return objects with properties instead of pure strings and ints? Well, we can!

First, let's create a class in our Web Site. Right click in the App_Code folder below the root folder and choose Add New Item. In the dialog box choose Class. Name it Pessoa.cs and click Ok. Here's the complete code:

public class Pessoa {

public string Nome { get; set; }
public string Sobrenome { get; set; }

}


Now let's get back to our Web Service and create a new method that take two parameters and returns an instance of Pessoa. Open the AjaxWs.cs again and add the following code under the HelloWorld method:

[WebMethod]
public Pessoa ObterPessoa(string nome, string sobrenome) {
return new Pessoa { Nome = nome, Sobrenome = sobrenome };
}


Now get back to Default.aspx and modify the HelloWorld method call to ObetrPessoa, giving the nome and sobrenome arguments before the callback argument:

function executarWs() {
AjaxWs.ObterPessoa(
"Estação",
"ZN",
function(resultado) {
alert(resultado.Nome + " " + resultado.Sobrenome)
}
)
}


Now run the Web Site again and see the result. Awesome! We had nearly zero effort and the possibilities are many with this technology. Thank you and take care.

Artigo completo (View Full Post)

Web Services em Ajax com ScriptManager

Click here to see this post in English

Neste post eu mostro uma facilidade incrível do ASP.Net que eu aprendi: Acessar Web Services via Ajax.

Com o componente ScriptManager - é o mesmo daquele post sobre ASP.Net e Ajax - podemos incluir referência para um Web Service criado no nosso WebSite, executá-lo e recuperar o resultado com um esforço mínimo de código. Com este componente parece que o Web Service é um objeto do próprio Script cliente da nossa página.


Bem, vamos começar criando projeto WebSite no Visual Studio (pode ser o Visual Web Developer Express Edition também). Escolham uma pasta para abrigar o WebSite (lembrando que para testar o VS inicia um servidor Web virtual com o nosso site) e pronto. Agora vamos criar nosso Web Service.

Clique com o botão direito na raiz do WebSite e selecione Add New Item. Na janela de New Item escolha Web Service. Chame de AjaxWs.asmx e clique Ok. A IDE vai abrir o arquivo App_Code/AjaxWs.cs. É nele que vamos trabalhar

Vamos Deixar a implementação dele como está por enquanto. Ele já vem com um método de exemplo HelloWorld. A única coisa que vamos fazer é "habilitar" que ele seja chamado por Script cliente. Para isso procure a definição da classe:

public class AjaxWs : System.Web.Services.WebService


Na linha acima desta há uma decoração comentada que nós só precisamos descomentar para adicionar esta funcionalidade:

// [System.Web.Script.Services.ScriptService]


Portanto descomente esta linha e salve o arquivo e chame o menu Build > Build Web Site.

A parte do Web Service está pronte (por enquanto). Agora vamos trabalhar no nosso WebForm para chamar este Web Service. Abra o arquivo Default.aspx e vá para a visualização "Source" ou "Split". Abaixo da tag do form

<form id="form1" runat="server">


vamos colocar um componente ScriptManager. Você pode arrastar da toolbox ou simplesmente digitar a tag. O VS deixa o tabalhar de digitar os componentes muito rápido e produtivo, apesar de parecer o contrário. Enfim, a tag fica assim depois de pronta:

<asp:ScriptManager runat="server" ID="ScriptMngr">
<Services>
<asp:ServiceReference Path="~/AjaxWs.asmx" />
</Services>
</asp:ScriptManager>


Com ele aí vamos criar um bloco de script na nossa página. Procure a seção <header> do WebForm e crie um bloco de script dentro. Abaixo está o código:

<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function executarWs() {
AjaxWs.HelloWorld(
function(resultado) {
alert(resultado)
}
)
}
</script>
</head>


Vou dar uma breve explicação sobre este script:

AjaxWs - que é o nome do nosso Web Service - foi definido automaticamente pelo VS quando nós colocamos o ScriptManager no WebForm. Estamos chamando o método HelloWorld do nosso Web Service e passando como argumento uma função - mais precisamente um callback. Um callback é uma definição de função que será chamado pela função que nós invocamos quando necessário. É um conceito semelhante ao de manipuladores de eventos. Em outro post eu me dedico somente a JavaScript.

Agora precisamos executar esta função de alguma maneira. A novidade da tecnologia já passou; agora podemos fazer como uma chamada normal de alguma função JavaScript. Para este exemplo vou criar um botão HTML no WebForm:

<button onclick="executarWs()">Clique aqui</button>


Abaixo segue o WebForm completo:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function executarWs() {
AjaxWs.HelloWorld(
function(resultado) {
alert(resultado)
}
)
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="ScriptMngr">
<Services>
<asp:ServiceReference Path="~/AjaxWs.asmx" />
</Services>
</asp:ScriptManager>
<div>
<button onclick="executarWs()">Clique aqui</button>
</div>
</form>
</body>
</html>


Agora execute o programa (F5) para ver o que nós fizemos em ação. Quando clicamos no botão a mensagem "Hello World" aparece. Isso por si só já é muito legal, mas imagine se, em vez de retornar somente uma string, pudéssemos retornar objetos com propriedades? Mas só pode!

Primeiro vamos criar uma classe no Web Site. Clique com o botão direito na pasta App_Code dentro da raiz do Web Site e clique Add New Item. Na janela selecione Class. chame o arquivo de Pessoa.cs e clique Ok. abaixo segue a classe pronta:

public class Pessoa {

public string Nome { get; set; }
public string Sobrenome { get; set; }

}


Agora vamos voltar no nosso Web Service e criar um novo método que pegue dois parâmetros e retorne uma instância de PEssoa. Abra o AjaxWs.cs outra vez e adicione o seguinte método abaixo do HelloWorld:

[WebMethod]
public Pessoa ObterPessoa(string nome, string sobrenome) {
return new Pessoa { Nome = nome, Sobrenome = sobrenome };
}


Agora volte no Default.aspx e modifique a chamada do método HelloWorld para ObterPessoa, passando agora os argumentos nome e sobrenome antes da função de callback:

function executarWs() {
AjaxWs.ObterPessoa(
"Estação",
"ZN",
function(resultado) {
alert(resultado.Nome + " " + resultado.Sobrenome)
}
)
}


Agora execute novamente e veja o resultado. Demais! Nosso esforço foi praticamente zero o as possibilidades são muitas com esta tecnologia. Um grande abraço a todos e até a próxima!

Artigo completo (View Full Post)

terça-feira, 9 de setembro de 2008

Cliente WebService – Delphi7 & Servidor Webservice BDS2006

Continuando, sobre WebServices, construiremos o cliente que consumirá o serviço que criamos no artigo “Webservice no BDS2006”.
No Delphi 7 inicie um novo projeto: Menu File ► New ► Application. Em seguida vou adicionar um TButton, um TlistBox no Form1.



Importando a WSDL

Próximo passo, importar a interface do serviço. Para isso, no browser digite a url para acessarmos o WebService. Usaremos o serviço contruido no artigo anterior, portanto digite na barra de endereços do browser: http://localhost/wsshowmethemoneyzn/
Click no link “IZnShowMeTheMoney [WSDL]”, a página que será exibida é o XML que define as especificações da interface do serviso “ZnShowMeTheMoney”. Salve esta página.





Voltando ao Delphi, no menu Menu File ► New ► Other, na aba WebServices selecione “WSDL Importer”.


Selecione o arquivo que acabamos de salvar, o arquivo XML que especifica a interface do serviço: “IZnShowMeTheMoney.xml”.



Em seguida click em “Next”, Tchan ... Tchan ... Tchammm ..!!!! Você acabou de importar a WSDL para sua aplicação cliente. Pode ficar emocionado amigo, agora você faz parte de um seleto grupo de indivíduos que ultrapassaram a fronteira do B2C (Businesses to Consumer) para o B2B (Businesses to Businesses). Parabéns! Em seguida, ao clicar em “Finish”, prosseguiremos salvando a nova unit, resultante da importação que acabamos de fazer, IZnShowMeTheMoney1.pas. Então, codificaremos a funcionalidade que evocará o serviço “IznShowMeTheMoney”.



Na unit1 farei uses da unit “IZnShowMeTheMoney1.pas”, Alt + F11. Falta ainda adicionar um THTTPRio (Palheta WebServices)





Na propriedade URL do HTTPRIO1 digite a url da interface, WSDL, do serviço “IznShowMeTheMoney” trocando o “/wsdl” para “/soap”. Exemplo: http://localhost/wsshowmethemoneyzn/PrjZNShowMoney.dll/soap/IZnShowMeTheMoney

No evento “OnClick” do Button1 digite conforme iluistrado abaixo:


procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add((HTTPRIO1 as IZnShowMeTheMoney).ZnShowMeTheMoney);
end;


Asseguir código completo da Unit1:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, InvokeRegistry, Rio, SOAPHTTPClient;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
HTTPRIO1: THTTPRIO;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses IZnShowMeTheMoney1, Math;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add((HTTPRIO1 as IZnShowMeTheMoney).ZnShowMeTheMoney);
end;

end.




Conclusões
Para consumir um WebService é preciso importar a interface so serviço para o programa cliente.
O Fato de usar um WebService não garante a interoperabilidade entre dois sistemas. É muito importante garantir que o tipo de dado da saída do seu serviço seja suportado pela tecnologia usada pelo cliente.
No nosso exemplo pudemos observar que um servidor Werbservice construido em BDS2006 pode ser consumido por um cliente desenvolvido em Delphi 7. O que já era de se esperar, contudo este pequeno exemplo não pode garantir que isso é válido para qualquer outro caso.

Artigo completo (View Full Post)

segunda-feira, 8 de setembro de 2008

Webservice no BDS2006

Observamos que o assunto "WebService em Delphi" tem tido muita procura aqui no blog. Por isso, pretendo produzir mais material sobre este tema. Contudo, o assunto é abrange um escopo bastante vasto, principalmente no que tange as questões práticas do desenvolvimento de serviços baseados em XML/SOAP. Podemos citar para exemplificar alguns temas sobre “WebService e Delphi”: Testar as versões mais recentes (inclusive o Tiburon – Delphi 2009), verificar incompatibilidades (se existirem), ou diferenças. Uma coisa interessante seria a integração com outras tecnologias (Java, C# e PHP, por exemplo). Outro ponto importante: Acesso e disponibilização de dados (um CRUD, talvez, usando como camada intermediária um aplicação servidora WS). Em fim, há bastante terreno para ser trabalhado.
Neste sentido, podemos eventualmente atender alguma questão pontual demandada pelos leitores. Coloque em forma de comentários sua demanda que na medida do possível teremos prazer em atendê-la. Algumas pessoas já solicitam nosso suporte, informalmente, via e-mail. Porém, seria melhor que além do e-mail o comentário sobre a demanda fosse registrado. Pois, dessa forma aproveitamos a resolução do seu problema para conteúdo do blog. Assim, outros que por ventura vierem até nós com problemas semelhantes possam compartilhar da solução sem gerar retrabalho para nós. Conseqüentemente, imagino que nosso conteúdo será mais aderente. Isso é o que de fato nos importa.

Iniciando um novo projeto

No BDS2006 no menu File ►New ► Other ► Delphi Projects ►WebServices, selecione “SOAP Server Application”. Em seguida uma série de configurações prévias serão feitas mediante alguns diálogos.



No diálogo seguinte selecione ISAPI/NSAPI Dynamic Link Library, e click em “OK”.



Click “Yes” para criar a interface do serviço (WSDL). Veja imagem abaixo:



No próximo diálogo definiremos o nome do serviço que estamos criando: “ZnShowMeTheMoney”, conforme ilustrado abaixo.



Pronto, temos um novo projeto! Estamos desenvolvendo uma aplicação servidora. Um WebService, veja as units que foram cridas na inicialização do nosso projeto:



A lógica sobre declarações nas units, num projeto WebService: Existe uma unit para declarações de interface e uma unit para as implementarmos o que declararemos na unit interface (neste caso temos: “ZnShowMeTheMoneyIntf”, interface. “ZnShowMeTheMoneyImpl”, implementação).

Na interface declararemos uma função. Digite conforme ilustrado abaixo:


(* Declarando uma funcionalidade no serviço que estamos criando *)
function ZnShowMeTheMoney: WideString; stdcall;

A seguir, veja como ficou a unit “ZnShowMeTheMoneyIntf”.

{ Invokable interface IZnShowMeTheMoney }

unit ZnShowMeTheMoneyIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

{ Invokable interfaces must derive from IInvokable }
IZnShowMeTheMoney = interface(IInvokable)
['{F002F904-9FD7-401D-80E2-037DFFAA4590}']

{ Methods of Invokable interface must not use the default }
{ calling convention; stdcall is recommended }
(* Declarando uma funcionalidade no serviço que estamos criando *)
function ZnShowMeTheMoney: WideString; stdcall;
end;

implementation

initialization
{ Invokable interfaces must be registered }
InvRegistry.RegisterInterface(TypeInfo(IZnShowMeTheMoney));

end.


Agora para implementarmos iremos fazê-lo na unit “ZnShowMeTheMoneyImpl”. Digite conforme ilustrado no trecho de código asseguir:

type

{ TZnShowMeTheMoney }
TZnShowMeTheMoney = class(TInvokableClass, IZnShowMeTheMoney)
public
(* Na unit de implementação precisamos digitar novamente a assinatura do
método que declaramos na interface "ZnShowMeTheMoneyIntf" *)
function ZnShowMeTheMoney: WideString; stdcall;
end;

implementation


Declare uma seção “uses” após a palavra reservada “implementation” e declare as bibliotecas: Math e SysUtils.

OBS: No BDS temos code insight para declaração de bibliotecas!!!



Vamos implementar o método declarado na seção public de “TZnShowMeTheMoney”.

function TZnShowMeTheMoney.ZnShowMeTheMoney: WideString;
const
ZnMsgConst = 'Here is your Money, U$ %f! Do you can see him? look at the message ... ';
var
RandomValue: Double;
RandomDiv: Integer;
begin
RandomValue := RandomRange(1, 10000);
RandomDiv := RandomRange(1, 7);
RandomValue := (RandomValue / RandomDiv);

Result := Format(ZnMsgConst, [RandomValue]);
end


A função que acabamos de codificar, “ZnShowMeTheMoney”, é simplesmente um processamento dummy que retorna aleatoriamente dois valores, os quais são usados como operandos numa divisão cujo o resultado é formatado numa string e retornado na função.
Agora vamos salvar a aplicação, veja ilustração abaixo:




Para o nome do projeto vamos usar “PrjZNShowMoney.bdsproj”. A imagem seguinte mostra, o meu “Project Manager”, para que você possa compara a estrutura do seu projeto com o andamento do nosso exemplo.



Agora vamos publicar nosso serviço: Compile o projeto, em seguida faça o deploy da DLL, “PrjZNShowMoney.dll”, no IIS.

Criei um diretório virtual com alias de “WsShowMeTheMoneyZn”. Para testar, no browser digite: http://localhost/wsshowmethemoneyzn/

Click no link WSDL e você acessará a interface do serviço “IZnShowMeTheMoneyservice”, isso que você esta vendo é mais que uma página web comum.




Neste primeiro exemplo podemos concluir que o desenvolvimento em WS no BDS2006 é semelhante ao do Delphi 7.
É Muito rápido, intuitivo e amigável desenvolver serviços RPC baseados em SOAP/XML no DBS2006, desde que você conheça bem três conceitos:

1 - A estrutura de declarações no Delphi.

2 - Calling Conventions: Convenções de chamadas (traduziremos assim)- Quando declaramos procedimentos ou funções podemos definir, neste momento, a convenção de chamada através das diretivas: register, pascal, cdecl, stdcall, and safecall.
Por exemplo:

function ZNFuncao(const Xzn, Yzn: Double): Double; cdecl;

function ZNProcedimento(const Xzn, Yzn: Double; var AoutZn: Double); stdcall;

3- Sistemas distribuídos: Também chamado na literatura de objetos distribuídos.

Outros artigos sobre Webservice e Delphi

Artigo completo (View Full Post)

sábado, 3 de fevereiro de 2007

Webservice: O que é isso? Pra que serve?

Contextualizando


Cada um dos três últimos séculos foi dominado por uma única tecnologia. (..)

As principais conquistas tecnológicas do séc XX se deram no campo da informação. Entre outros desenvolvimentos, vimos a intalação das redes de telefonia em escala mundial(..) o nascimento e o crescimento sem presedentes da industria de computadores e o lançamento de satélites de comunicação.(..)

A medida que cresce a nossa capacidade de colher, processar e distribuir informações, torna-se ainda maior a necessidade de formas de processamento da informação ainda mais sofisticadas "1


Embora o surgimento dos protocolos de chamda remota (RPCs) não tenha nenhuma dependência com a Internet. É impotante considerar que seu aparecimento foi um combustível poderoso para o cenário de conectividade e interoperabilidade que vivenciamos. Antes da Internet, o discurso sobre a possibilidade de sistemas construídos com linguagens diferentes, rodando em plataformas diferentes, interagirem, era algo bem tímido, digamos assim. É bem provável que uma idéia como essa, antes da Internet, só poderia ser cogitada na cabeça de dois tipo extremos: um leigo ou de um Cyber-visionário.

Naquela época, da imaginação até a realização desta idéia, havia um abismo tecnológico a ser atravessado. Como fazer para que uma aplicação possa reconhecer os métodos da minha, e vice-versa? Qual o tipo de dado que uma determinada função da aplicação “X” retorna? Conhecendo, então, o tipo de dado que retorna, será que meu sistema suporta? E os parâmetros de entrada? Quantos seriam, quais seriam e de que tipo? O visionário diria: “...Eu só preciso de uma interface!!!...”. Todavia, a diversificação de arquiteturas, plataformas e linguagens é tamanha que a construção dessa interface seria demasiadamente dispendiosa, tanto no aspecto do trabalho de codificação, quanto no custo financeiro e mesmo assim, esta interface dificilmente poderia ser re-aproveitada em mais de uma circunstância.

O advento da Internet, de fato, fez com que vislumbrássemos mais de perto essa realização. Agora os computadores já podem interagir, evidentemente com algumas restrições. Na verdade, é o usuário que, através de um computador, interage com um outro computador. Podemos dizer que fisicamente está tudo consolidado. Não existem mais barreiras de arquitetura ou plataformas, desde que todos utilizem o mesmo protocolo. O TCP/IP (Transmission Control Protocol/Internet Protocol) é a língua comum dos computadores que integram a Internet.

Considerando que todos os avanços tecnológicos respondem a estímulos, a informática não foge a essa regra. É muito importante analisarmos algumas afirmações que foram propostas como leis a partir da consolidação da Internet, suas implicações para o ramo de desenvolvimento de software ante a demanda do mercado hoje, são elas:

Lei de Moore:

O número de transistores por centímetro quadrado em um chip dobraria a cada 18 meses.

Lei de Guilder:

A largura de banda da rede triplicaria a cada ano.

Lei de Metcalfe:

A utilidade da rede é equivalente ao quadrado do número de nós.

Embora muitos analistas e programadores ainda não tenham se dado conta, essas leis identificaram o espaço de evolução de nossos sistemas e têm sido um paradigma importante para o mercado de desenvolvimento de software.

Considerando a lei de Moore

Apesar das tecnologias convencionais tirarem proveito do aumento de nós nas redes (Lei de Metcalfe) e também do aumento da largura de banda da Internet (Lei de Guilder), o desenvolvimento de sistemas centralizados ou distribuídos, a partir de tecnologias proprietárias, ignora ou pelo menos tira muito pouco proveito da lei de Moore.

Ao levarmos em conta o aumento do poder de processamento e a miniaturização dos computadores (Moore), está cada vez mais próxima a realidade de que nossos equipamentos domésticos estejam capazes de prover serviços. Seu micro, seu Palm, seu celular já são capazes de fornecer diversos serviços, mas talvez você não saiba que isso já está se tornando uma realidade para sua geladeira, televisão e etc. Em breve, esses equipamentos, hoje coadjuvantes no mundo dos grandes servidores, passarão a exigir uma participação mais ativa no mundo dos objetos distribuídos. E como é que nós desenvolvedores iremos criar sistemas, não mais centralizados, que não seguem mais as regras às quais estamos acostumados? Ou como fazer para integrar sistemas de plataformas heterogenias e até mesmo sistemas legados?

Estamos caminhando para um mundo cada vez mais conectado, onde um número crescente de equipamentos, sistemas, aparelhos e pessoas precisarão se comunicar e trocar informações. Conectividade, integração, fusão, tornaram-se termos corriqueiros e são as aplicações construídas com uma arquitetura distribuída que farão desta visão a realidade, a qual somos nós os responsáveis por construir.

Cada vez mais, nos dia de hoje, cresce a demanda nos departamentos de informática dos mais diversos setores, corporativos ou não, por soluções que venham viabilizar e otimizar os serviços, a troca de informação, a interação e a integração de sistemas de informação. Precisamos, então, desenvolver interfaces capazes de atender essas necessidade de maneira eficiente e eficaz.

"...A fusão dos computadores e das comunicações teve uma profunda influência na forma como os sistemas computacionais eram organizados. Está totalmente ultrapassado o conceito de um "centro de computadores", (...) o velho modelo de um computador atendendo a todas as necessidades computacionais da organização foi substituido pelas chamdas redes de computadores, nais quais os trabalhos são realizados por uma série de computadores interconectados..."2

Os WebServices podem conectar os sistemas da empresa com serviços de parceiros, cadeias de fornecimento altamente otimizadas ou canais de entrega mais amplos, provendo um serviço em tempo real ao consumidor de um modo melhorado.

Os WebServices podem ser utilizados ainda, para agregar conteúdo interno e externo a aplicações, provendo portais mais dinâmicos e colaborativos. Eles são um modelo de aplicação que combina aspectos de desenvolvimentos baseados em componentes reutilizáveis. Este modelo está tendo grande aceitação no mercado e apoio de grandes indústrias de software, como Microsoft, IBM e Sun.

Assuntos Relacionados:

http://www.sei.cmu.edu/architecture/
http://pt.wikipedia.org/wiki/Arquitetura_de_software
http://en.wikipedia.org/wiki/Three-tier_%28computing%29
http://en.wikipedia.org/wiki/Distributed_computing

[2]Tanenbaun S. Andrew, Redes de computadores página 2





[1]Tanenbaun S. Andrew, Redes de computadores página 1

Artigo completo (View Full Post)

Construindo um WebService - Delphi

Esse exemplo foi desenvolvido em Delphi 7

Iniciando a implementação do nosso WebService, voltaremos na barra de menu do principal do Delphi: File New Other WebService SOAP Server Application.

Em segida prossiga com o passo-a-apsso Abaixo:


Click no ícone SOAP Server Application. Na próxima caixa de diálogo você terá de escolher que tipo de tecnologia de script do lado servidor seu Webservice irá utilizar. Para este exemplo marque a opção “CGI Satand-alone executable”.


Em seguida o Delphi irá perguntar se desejamos que ele crie uma interface para a aplicação. Clicke em “Yes”. Sim, queremos criar a interface. Se você deseja que seu serviço seja utilizado por outro sistema, será necessário para isso criar uma interface desse serviço. No protocolo de Webservice esse interface estará definida dentro de um padrão chamado WSDL. A grande vantagem de vc desenvolver webservices em Delphi é que ele te abstrai de todos esses detalhes. Por isso, poderemos prossegui nosso exmplo sem a obrigatoriedade de lermos um catatal de especicifações de protocolos. HAUHAUHHA ..... graças a Deus. Foi mal, mas .... isso é muito bom.

Em “service name” digite “Servicos”, fazendo isto estamos criando uma interface para o nosso serviço com o nome de “servicos”.



Para a seleção de Service activation model definiremos Per Request, escolhendo essa opção estaremos definido como as requisições ao nosso serviço serão atendidas. Você pode desmarcar a checkedbox (generate comments) como o nome já diz, desta forma o Delphi, quando acabarmos de definir todos os parâmetros dessa aplicação, não gerará comentários sobre as Units criadas. Veja o exemplo abaixo, para um melhor acompanhamento siga estritamente a nomenclatura aqui utilizada.





Note que foram criadas Quatro unidades: Projetc1, ServicosImpl, ServicosIntf, Unit1. No teclado aperte Ctrl+F12 (View Unit), e compare com a figura ao lado.

ServicosImpl: unidade de implementação, correspondente ao arquivo ServicosImpl.pas

ServicosIntf: Unidade onde estarão as declarações referentes à interface. Correspondente ao arquivo ServicosIntf.pás.

Já é hora de salvar o que foi feito até agora pressione "CTRL + Shift + S".

Junto com o WebModule criado é automaticamente adicionado os componentes fundamentais para a implementação do servidor. Para visualizar o WebModulo, no teclado aperte Ctrl+F12 (View Unit), e selecione Unit1.

HTTPSoapDispatcher: Recebe e envia mensagens (Web) para o objeto especificado em sua propriedade

“Dispatcher”, para que sejam decodificadas. Registra-se automaticamente junto ao

WebModule, fazendo com que não seja necessário a criação de actions que direcionam

as requisições para o HTTPSoapDispatcher. Desta forma ele pode receber todas as

requisições automaticamente.

HTTPSoapPascalInvoker: Recebe as mensagens enviadas pelo HTTPSoapDispatcher e a interpreta, fazendo com

que sejam executados os métodos correspondentes à solicitação. E também faz o

caminho contrário codificando o retorno do método para o padrão SOAP.

WSDLHTMLPublish: Publica todas as informações registradas pelo Web Service, usando WSDL.


Criando o primeiro serviço

Nosso primeiro exemplo consiste em criar um serviço que informe a data e a hora local do servidor. Para isso implementaremos uma função que retorne esta a data, dia da semana e hora.

Em ServicosIntf , vamos declarar o cabeçalho da função “DataHoraDiaLOcal”. seguida codificaremos o corpo desta função em ServicosImpl. Veja no exemplo abaixo, declaramos a função na sessão “Type”, logo abaixo do GUID:




Aqui declaramos somente a assinatura, note que o nome dessa Unit sugere uma área de delaração como a seção Interface numa unit .pas comun, ServicosIntf. Logo, para codificarmos o corpo desta função termos de fazê-lo na unit correspondente a seção de implementation, podemos fazer um “Ctrl+C” do cabeçalho(function DataHoraDiaLOcal: string: stdcall;) e colarmos em ServicosImpl.

Feito o “Ctrl+V” na sessão Public de ServicosImpl. Com o cursor ainda na mesma linha, pressione “Ctrl+Shift+C” para que o Delphi escreva o corpo da função, observe o exemplo abaixo:

function TServicos.DataHoraDiaLocal: String;
begin

Result := FormatDateTime( 'dd mmmm, dddd, yyyy. HH:nn:ss ' , Now)

end;

Pronto, no que diz respeito a codificação nosso primeiro exemplo termina aqui, basta que Compilemos a aplicação (no Menu: Project Compile Project, ou pelo atalho "Ctrl + F9") , sempre lembrado de salvar o exemplo com SaveAll (Ctrl+Shift+S). Contudo, antes de executar a aplicação é preciso fazer o deploy dessa aplicação. Utilizaremos o IIS para isso. Portanto, crie uma pasta virtual no IIS apontado para o diretório onde está o executável compilado pelo exemplo que estamos criando. Defina como documento principal o .exe. Pronto, acabou!!

Com a aplicação devidamente compilada, salva e feito o deploy. Podemos testá-la no browser, digitando na barra de endereços:

http://LocalHost/ nome_da_pasta_virtual


Repare que a nossa função está publicada. Clicke no browser em Iservicos [WSDL] para visualizar a implementação. É preciso salvarmos este arquivo XML para que possamos importar esta interface para a aplicação cliente que construiremos num outro post.

Veja o próximo no exemplo a página onde Delphi gerou todo o código XML correspondente a nossa implementação. Podemos também gerar um arquivo XML com a definição do nosso serviço.

No próximo post exemplificaremos um aplicativo cliente para consumir esse serviço que acabamos de criar.

Mais artigos no Estação Zn sobre Ws


Preciso saber mais sobre Webservices ...

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br