Programação para Internet Avançada 4. Web Services Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt
São módulos de aplicações de negócios que expõem as regras do negócio como serviços na Internet através de interfaces programáveis Recorrem a protocolos da Internet para fornecer mecanismos de descoberta, subscrição e invocação desses serviços. Exemplo: Site de vendas on-line que necessita validar o crédito do comprador antes de proceder à venda. (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 2
Exemplo (cont.) O sistema acede a um serviço (Web Service) responsável por todos os passos necessários à verificação de crédito. Verifica o histórico das compras efectuadas pelo consumidor na empresa; Verifica a situação de crédito do consumidor no sistema público, etc; O Web Service obtém estes dados e retorna a situação de crédito deste consumidor para o site. (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 3
Os Web Services são acessível através de protocolos standard da Internet HTTP como protocolo de transporte SOAP (Simple Object Access Protocol) como protocolo de invocação Vantagens: Permitem que um servidor na Internet publique um conjunto de funções (serviço) Possível aceder utilizando protocolos bem estabelecidos e omnipresentes na Internet Permite uma maior interoperabilidade entre sistemas existentes (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 4
SOAP - Simple Object Access Protocol Protocolo projectado para invocar aplicações remotas através de RPC (Remote Procedure Calls) ou troca de mensagens, num independente da plataforma e da linguagem de programação. Características: Definido pelo consórcio W3C. Protocolo baseado em XML para a troca de informações em um ambiente distribuído; Padrão de utilização com Web Services; Normalmente utiliza HTTP como protocolo de transporte; (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 5
SOAP - Simple Object Access Protocol Mensagem SOAP Envelope: (Obrigatório) Elemento raiz do documento XML. Pode conter declarações de namespaces e também atributos adicionais como o que define o estilo de codificação (encoding style), definindo como os dados são representados no documento XML. Header: (Opcional) Contém informações adicionais, como por exemplo, se a mensagem deve ser processada por um determinado nó intermediário. Body: (Obrigatório) Contém o payload, ou a informação a ser transportada para o seu destino final. O elemento Body pode conter um elemento opcional Fault, usado para carregar mensagens de status e erros retornadas pelos "nós" ao processarem a mensagem. (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 6
SOAP - Simple Object Access Protocol Mensagem SOAP Exemplo de Request (pedido) <?xml version="1.0" encoding="utf-8"?> <soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:body> <Soma xmlns="http://tempuri.org/"> <valor1>10</valor1> <valor2>20</valor2> </Soma> </soap:body> </soap:envelope> (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 7
SOAP - Simple Object Access Protocol Mensagem SOAP Exemplo de Response (resposta) <?xml version="1.0" encoding="utf-8"?> <soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:body> <SomaResponse xmlns="http://tempuri.org/"> <SomaResult>30</SomaResult> </SomaResponse> </soap:body> </soap:envelope> (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 8
WSDL - Web Service Description Language Para o programador utilizar um serviço é necessário que este conheça o serviço. Quais os métodos? Que tipo de dados estão envolvidos? Quando um web service é publicado é publicado conjuntamente a sua especificação em XML (escrita em WSDL). A aplicação WSDL.exe Obtém a especificação de um serviço em WSDL Gera uma classe que encapsula a utilização do serviço O programador apenas tem que criar e utilizar objectos dessa classe. (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 9
Exemplo passo a passo da criação, publicação e consumo de um WebService Método que permite adicionar dois valores, retornando o resultado Algoritmos.asmx <%@ WebService Language="c#" Class="Algoritmos" %> using System; using System.Web.Services; [WebService(Namespace="http://pia.estgoh.ipc.pt/")] public class Algoritmos:WebService { [WebMethod] public int Soma(int valor1, int valor2) { return valor1+valor2; (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 10
Exemplo passo a passo da criação, publicação e consumo de um WebService (cont.) Para testar, basta correr: http://localhost:1212/website5/algoritmos.asmx Nesse momento deverá ser criado um ficheiro Algoritmos.cs na pasta App_Code Posteriormente clicando com o botão direito do rato sobre o nome do WebSite selecciona-se a opção Add web reference e indica-se o caminho completo para o nosso Web Service (ex: http://nomeserver/serv.asmx) Devem agora ser criados três ficheiros na pasta App_WebReferences: Algoritmos.disco, Algoritmos.discomap, Algoritmos.wsdl (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 11
Exemplo passo a passo da criação, publicação e consumo de um WebService (cont.) Somador.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Somador.aspx.cs" Inherits="Somador" %> <!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>somador</title> </head> <body> <form id="form1" runat="server"> <div> <asp:textbox ID="TextBox1" runat="server" ></asp:textbox> <asp:textbox ID="TextBox2" runat="server"></asp:textbox> <asp:label ID="Label1" runat="server"></asp:label> <asp:button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> </div> </form> </body> </html> (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 12
Exemplo passo a passo da criação, publicação e consumo de um WebService (cont.) Somador.aspx.cs... protected void Button1_Click(object sender, EventArgs e) { Algoritmos algoritmos = new Algoritmos(); int a = 0, b = 0, c = 0; a = int.parse(textbox1.text); b = int.parse(textbox2.text); try{ c = algoritmos.soma(a, b); catch (System.Net.WebException we){ Label1.Text = "Ocorreu um erro!"; Label1.Text = c.tostring();... (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 13
Informação disponível a um Web Service O ciclo de vida destes serviços não corresponde ao ciclo de vida de um objecto normal. Sempre que existe uma invocação do método é criado um novo objecto que é utilizado para fazer a invocação. A classe WebService disponibiliza um conjunto de propriedades importantes: Application Representa a aplicação correspondente ao web service como um todo. (não está associado a nenhum cliente em particular, nem a nenhuma sessão) Context Encapsula toda a informação HTTP específica do pedido que está em curso Server Representa o servidor em causa Session: Representa a sessão corrente User Representa o utilizador a utilizar o web service (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 14
Informação disponível a um Web Service Exemplo do uso de Application public Algoritmos() { if (Application["visitas"] == null; Application["visitas"]=0; [WebMethod] public int ContaVisitas() { int totalvisitas = (int)application["visitas"]; totalvisitas++; Application["visitas"] = totalvisitas; return totalvisitas; (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 15
Informação disponível a um Web Service Exemplo do uso de Session public Algoritmos() { if (Session["visitas"] == null; Session["visitas"]=0; [WebMethod(EnableSession=true)] public int ContaVisitas() { int totalvisitas = (int)session["visitas"]; totalvisitas++; Session["visitas"] = totalvisitas; return totalvisitas; (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 16
Thread safe A invocação de um método de um web service não é thread safe. Podem ocorrer invocações simultâneas Os acessos a Application["visitas"] e Session["visitas"] deve ser feito em exclusão mútua.... [WebMethod(EnableSession=true)] public int ContaVisitas() { Application.Lock(); int totalvisitas = (int)session["visitas"]; totalvisitas++; Session["visitas"] = totalvisitas; Application.UnLock(); return totalvisitas; (c) Nuno Miguel Gil Fonseca - Escola Superior de Tecnologia e Gestão de Oliveira do Hospital - Programação para Internet Avançada 17