930 likes | 1.02k Vues
Implementando Serviços Web. MO818 – Tópicos em Redes de Computadores Prof. Dr. Edmundo Madeira Instituto de Computação - Unicamp. Tópicos. Introdução Alguns conceitos de .NET Serviços web na plataforma .NET Serviços web na plataforma J2EE Comparação J2EE x .NET Considerações finais
E N D
Implementando Serviços Web MO818 – Tópicos em Redes de Computadores Prof. Dr. Edmundo Madeira Instituto de Computação - Unicamp Francisco Hoyos
Tópicos • Introdução • Alguns conceitos de .NET • Serviços web na plataforma .NET • Serviços web na plataforma J2EE • Comparação J2EE x .NET • Considerações finais • Referências Francisco Hoyos
Introdução • J2EE e .NET são duas das principais plataformas para desenvolvimento, execução e consumo de serviços web. • No que consiste o suporte ao usuário e desenvolvedor de serviços web nessas plataformas? • Qual ambiente de execução elas oferecem aos serviços? Francisco Hoyos
.NET: Definição • “.NET é a estratégia da Microsoft para conectar sistemas, informação e dispositivos através de web services para que as pessoas possam colaborar e comunicar-se mais efetivamente.” • “A Microsoft oferece uma completa gama de software que ajuda organizações e indivíduos a se beneficiarem da conectividade baseada em web services: ferramentas de desenvolvimento Visual Studio .NET, Windows Server System que hospeda web services e aplicações para desktop como Office, que consomem web services.” Francisco Hoyos
.NET: Origens • Em outubro de 2000, Microsoft, HP e Intel submeteram as especificações da linguagem C# e da Common Language Infrastructure (CLI) à ECMA (European Computer Manufacturers Association) para padronização. • Em dezembro de 2001 ambas foram aprovadas pela ECMA e em 2003 pela ISO. Francisco Hoyos
.NET: Common Language Infrastructure • A CLI inclui: • Common Intermediate Language (CIL) • linguagem independente de plataforma • Common Type System (CTS) • conjunto de tipos e operações compartilhados por várias linguagens de programação • Common Language Specification (CLS) • toda linguagem de programação “.NET-compliant” deve atender a essa especificação Francisco Hoyos
.NET: Plataforma • O .NET Framework é composto pelo Common Language Runtime e a .NET Framework class library. • Enterprise Servers incluem SQL Server, Exchange Server, BizTalk, Commerce Server. Francisco Hoyos
.NET: CLR • O CLR é a implementação Microsoft da especificação CLI. • Quando uma aplicação .NET é executada, o CLR gerencia o carregamento e a execução do código e provê vários serviços “runtime” à aplicação, como: gerenciamento de memória (garbage collection), de threads e de segurança. Francisco Hoyos
.NET: execução de código nativo • Aplicações .NET são compiladas para MSIL (Microsoft Intermediate Language, o mesmo que CIL). • Quando a aplicação é executada pela primeira vez, o runtime faz uma compilação just-in-time para converter o código MSIL para código de máquina. Francisco Hoyos
.NET: execução no CLR Francisco Hoyos
.NET: CLS • A CLS (Common Language Specification) define um conjunto de tipos de dados que podem ser usados por qualquer linguagem “.NET-compliant”. Isso permite completa integração entre aplicações desenvolvidas em linguagens diferentes: • um tipo definido em uma linguagem pode ser herdado em outra linguagem • exceções podem ser lançadas de uma linguagem e capturadas em uma outra Francisco Hoyos
.NET: managed/unmanaged code • Código feito para .NET é chamado managed code e pode dispor dos serviços oferecidos pelo runtime .NET. • Qualquer outro código é chamado unmanaged code, pode ser executado pelo CLR, mas não tem acesso aos serviços deste. Francisco Hoyos
.NET: Framework Class Library • Pode ser dividida em quatro grupos: • Base Class Library (BCL): funcionalidades comuns (ex: tipos de dados “core”) • ADO.NET e XML: acesso e manipulação de dados (tipicamente obtidos de um banco de dados); conversão dos dados para XML • Windows Forms: desenvolvimento de aplicações Windows tradicionais para desktop (“controls”) • ASP.NET: desenvolvimento de aplicações web Francisco Hoyos
ASP.NET • Sucessor da tecnologia Active Server Pages. • Simplificação do processo de desenvolvimento de serviços web. • Modelo “web forms” para desenvolvimento de interfaces para web browser. “Controls” presentes nas web forms executam no servidor e não no cliente. “Look and feel” muito semelhante ao das Windows forms. Francisco Hoyos
ASP.NET • Páginas com extensão .aspx. • Quando um browser requisita uma página aspx, o “runtime” ASP.NET compila o conteúdo numa classe .NET. A partir daí essa classe processa os acessos à página original. • A lógica do programa pode ser fisicamente separada do HTML da página através da técnica “code-behind”. Francisco Hoyos
.NET Web Services • Um dos principais focos da plataforma .NET. • Classes .NET pré-existentes podem ter seus métodos facilmente expostos como serviços web. • Um serviço web é definido através de uma página .asmx. Francisco Hoyos
Servidor “na raça” • Receber requisição SOAP via HTTP • Usar XML parser para obter nome da operação invocada e seus parâmetros • Montar mensagem SOAP de resposta “manualmente”, usando uma biblioteca XML • Enviar resposta SOAP via HTTP Francisco Hoyos
Serviço web definido no .asmx <@% WebService class="MathServiceJit" language="C#"%> using System.Web.Services; public class MathServiceJit { [WebMethod] public double Add(double x, double y) { return x + y; } [WebMethod] public double Subtract(double x, double y) { return x - y; } } Francisco Hoyos
Serviço web fora do .asmx:arquivo fonte C# using System.Web.Services; public class MathService { [WebMethod] public double Add(double x, double y) { return x + y; } [WebMethod] public double Subtract(double x, double y) { return x - y; } } Francisco Hoyos
Serviço web fora do .asmx:página .asmx <@% WebService class="MathService" language="C#"%> OU <@% WebService class="MathService"%> OU <@% WebService class=“MyNS.MathService, MyAssembly"%> • A forma recomendada de implementação é manter e compilar separadamente a classe que implementa o serviço web. • No Visual Studio .NET a diretiva @WebService é adicionada automaticamente ao arquivo .asmx. Francisco Hoyos
Atributo WebService [WebService(Namespace="http://www.notashop.com/wscr", Description="SimpleService1", Name="Try This Out")] public class MyService { ... } • Namespace deve ser usado quando o serviço for disponibilizado. Se não for especificado, http://tempuri.org será automaticamente usado. Francisco Hoyos
Atributo WebMethod • Pode vir acompanhado das seguintes propriedades: • Description • MessageName • EnableSession • CacheDuration • TransactionOption • BufferResponse Francisco Hoyos
WebMethod: Description, MessageName e EnableSession • Description: Descrição textual da operação. Aparece no WSDL. • MessageName: Nome pelo qual a operação é conhecida pelo cliente. Aparece no WSDL. • EnableSession: Se true, o serviço tem acesso aos objetos que mantêm o estado da sessão com cada cliente. Francisco Hoyos
WebMethod: CacheDuration • CacheDuration: Especifica o tempo em segundos que o resultado de uma operação será armazenado na memória. O resultado é mantido na forma de um par request/response. Novos pedidos de execução da mesma operação, com os mesmos parâmetros, serão respondidos com dados diretamente do cache, sem a invocação do serviço. Francisco Hoyos
WebMethod: TransactionOption e BufferResponse • TransactionOption: Permite especificar que o web method seja executado numa transação. A transação é interrompida quando uma exceção é lançada ou quando o método SetAbort da classe System.EnterpriseServices.ContextUtil é chamado. • BufferResponse: Se true, a resposta do serviço é inteiramente armazenada antes de ser enviada ao cliente, ao invés de ser enviada em várias pequenas partes. Francisco Hoyos
A classe WebService using System.Web.Services; public class MathService : System.Web.Services.WebService { [WebMethod] public double Add(double x, double y) { return x + y; } } • Se o serviço especificar WebService como classe base, ele ganha acesso a objetos ASP.NET, tais como Application, Session, User e Context, que oferecem facilidades para gerenciamento de sessão e identificação do usuário do serviço. Francisco Hoyos
.NET WS: exemplo using System; using System.Web.Services; public class Point { public double x; public double y; } [WebService(Namespace="urn:geometry")] public class Geometry { [WebMethod] public double Distance(Point orig, Point dest) { return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) + Math.Pow(orig.y-dest.y, 2)); } } Francisco Hoyos
.NET WS: SOAP request <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <Distance xmlns="urn:geometry"> <orig> <x>0</x> <y>0</y> </orig> <dest> <x>3</x> <y>4</y> </dest> </Distance> </soap:Body> </soap:Envelope> Francisco Hoyos
.NET WS: SOAP response <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DistanceResponse xmlns="urn:geometry"> <DistanceResult>5</DistanceResult> </DistanceResponse> </soap:Body> </soap:Envelope> Francisco Hoyos
.NET WS: uso de atributos using System; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Serialization; public class Point { [XmlAttribute] public double x; [XmlAttribute] public double y; } [WebService(Namespace="urn:geometry")] public class Geometry { [WebMethod] [SoapDocumentMethod(RequestElementName="CalcDistance", ResponseElementName="CalculatedDistance")] [return: XmlElement("result")] public double Distance([XmlElement("o")] Point orig, [XmlElement("d")] Point dest) { return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) + Math.Pow(orig.y-dest.y, 2)); } } Francisco Hoyos
SOAP request resultante <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <CalcDistance xmlns="urn:geometry"> <o x=“0” y=“0” /> <d x=“3” y=“4” /> </CalcDistance> </soap:Body> </soap:Envelope> Francisco Hoyos
SOAP response resultante <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <CalculatedDistance xmlns="urn:geometry"> <result>5</result> </CalculatedDistance> </soap:Body> </soap:Envelope> Francisco Hoyos
Acessando o SOAP header 1 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <x:UsernameToken xmlns:x="http://example.org/security"> <username>Mary</username> <password>yraM</password> </x:UsernameToken> </soap:Header> <soap:Body> <CalcDistance xmlns="urn:geometry"> ... Francisco Hoyos
Acessando o SOAP header 2 • Criar uma classe .NET que representa o tipo do elemento desejado no header, conforme o XML Schema [XmlType(Namespace="http://example.org/security")] [XmlRoot(Namespace="http://example.org/security")] public class UsernameToken : SoapHeader { public string username; public string password; } Francisco Hoyos
Acessando o SOAP header 3 using System; using System.Web.Services; using System.Web.Services.Protocols; [WebService(Namespace="urn:geometry")] public class Geometry { public UsernameToken Token; [WebMethod] [SoapHeader("Token")] public double Distance(Point orig, Point dest) { if (!Token.username.Equals(Reverse(Token.password))) throw new Exception("access denied"); return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) + Math.Pow(orig.y-dest.y, 2)); } } Francisco Hoyos
Cliente “na raça” • Montar mensagem SOAP “manualmente”, usando uma biblioteca XML • Enviar mensagem via HTTP • Receber resposta SOAP via HTTP • Usar XML parser para obter valor de retorno incluído na resposta Francisco Hoyos
.NET WS: cliente • O consumo de serviços web em .NET é feito através de classes proxy. • O programa wsdl.exe gera uma classe proxy a partir do WSDL do serviço. Entre outras opções, wsdl.exe permite selecionar a linguagem de programação em que o proxy é implementado. • Visual Studio .NET gera automaticamente a classe proxy através da opção “Add Web Reference”. Francisco Hoyos
Adicionando uma Web Reference 1 Francisco Hoyos
Adicionando uma Web Reference 2 Francisco Hoyos
Adicionando uma Web Reference 3 Francisco Hoyos
Usando a classe proxy private void Submit1_Click(object sender, System.EventArgs e) { Simple1.TryThisOut svc1 = new Simple1.TryThisOut(); SvcOutput1.Text = svc1.WakeUp(SvcInput1.Text); } Francisco Hoyos
.NET WS: invocação assíncrona de serviços • Para cada operação XYZ do serviço são gerados dois métodos para invocação assíncrona: • BeginXYZ(): invoca XYZ sem aguardar pela resposta, retornando ao chamador imediatamente. • EndXYZ(): retorna o resultado da invocação a XYZ. Francisco Hoyos
.NET WS: invocação assíncrona, polling static IAsyncResult tempHolder1; WeatherFetcher.USWeather USW = new WeatherFetcher.USWeather( ); private void Button1_Click(object sender, System.EventArgs e) { Button1.Enabled = false; tempHolder1 = USW.BeginGetWeatherReport(TextBox1.Text, null, null); } private void Button2_Click(object sender, System.EventArgs e) { if (tempHolder1.IsCompleted) { Label2.Text += USW.EndGetWeatherReport(tempHolder1) + "<br>"; Button1.Enabled = true; tempHolder1 = null; } else { Label2.Text += "1 is Still completing..."; } } Francisco Hoyos
.NET WS: invocação assíncrona, callback private void Button1_Click(object sender, System.EventArgs e) { Button1.Enabled = false; AsyncCallback callBack = new AsyncCallback(MyCallBack); USW.BeginGetWeatherReport(TextBox1.Text, callBack, USW); Label2.Text = "Web Service called..."; } public void MyCallBack(IAsyncResult AsyncResult) { string ReturnValue; ReturnValue = USW.EndGetWeatherReport(AsyncResult); Label2.Text += "<br>" + "Weather Report = " + ReturnValue; Button1.Enabled = true; } Francisco Hoyos
J2EE • Plataforma para o desenvolvimento de aplicações para o meio empresarial • Antecede web services • J2EE 1.4 foi a primeira versão a adotar completamente o paradigma de web services Francisco Hoyos
J2EE: plataforma Francisco Hoyos
J2EE 1.4: APIs Francisco Hoyos
J2EE 1.4 • Preocupação com interoperabilidade: adoção do Basic Profile (BP), publicado pela Web Services Interoperability Organization (WS-I) (www.ws-i.org). • BP especifica como usar XML, WSDL, SOAP e UDDI conjuntamente, eliminando ambigüidades. Francisco Hoyos
J2EE Web Service APIs • JAX-RPC (Java API for XML-based RPC): permite a criação (servidor) e consumo (cliente) de web services • SAAJ (SOAP with Attachments API for Java): usada na criação e manipulação baixo nível de mensagens SOAP • JAXR (Java API for XML Registries): acesso aos “catálogos” UDDI • JAXP (JAVA API for XML Processing): junto com DOM e SAX, permite a manipulação de documentos XML Francisco Hoyos
JAX-RPC: servidor • Existem dois modelos de programação: • JAX-RPC Service Endpoint (JSE): mais simples, baseado em servlet containers • Enterprise Java Beans (EJB) endpoint: baseado em stateless EJBs Francisco Hoyos