Tópicos de Sistemas de Informação A Carlos Oberdan Rolim Ciência da Computação SOAP (Simple Object Access Protocol) Contexto Introdução SOAP significa Simple Object Access Protocol. SOAP é um protocolo de comunicação. SOAP é para comunicação entre aplicações. SOAP é um simples protocolo baseado em XML para permitir aplicações trocarem informação sobre HTTP ou outro protocolo. Introdução Surgiu em 1998 Proposto pela DevelopMentor, Microsoft e UserLand Software como um “Internet Draft” Definia um mecanismo para transmissão de procedimentos remotos XML sobre HTML Proposta a W3C em Maio de 2000 Primeira versão pública em Dezembro de 2001 Versão atual 1.2 Arquitetura Plataforma de Serviço na Web SOAP request Servidor SOAP Converte msg SOAP a tipo de dado e invoca o serviço. Cliente SOAP Converte resultado da operação a msg SOAP e envia msg. SOAP response Serviç o SOAP 1.2 Dividido em duas partes Service Oriented Architecture Protocol: Framework de mensagens Mensagem representa a informação necessária para invocar um serviço ou analisar o resultado de uma chamada e contém informações específicas da definição da interface do serviço. Service Object Access Protocol: um conjunto de regras de codificação para expressar instâncias dos tipos de dados definidos pela aplicação uma convenção para representar RPCs e respostas um conjunto de regras para usar SOAP com HTTP/1.1 Define o método de invocação de um objeto remoto Principais vantagens Pode atravessar firewalls com facilidade. Os dados do SOAP são estruturados usando XML. Portanto, as mensagens podem ser compreendidas por quase todas as plataformas de hardware, sistemas operacionais e linguagens de programação. Pode ser usado, potencialmente, em combinação com vários protocolos de transporte de dados, como HTTP, SMTP e FTP. O SOAP mapeia satisfatoriamente para o padrão de solicitação / resposta HTTP. Pode ser usado tanto de forma anônima como com autenticação (nome/senha). Principais desvantagens Falta de interoperabilidade entre ferramentas de desenvolvimento do SOAP. Embora o SOAP tenha amplo suporte, ainda existem problemas de incompatibilidades entre diferentes implementações do SOAP. Mecanismos de Segurança Imaturos. O SOAP não define mecanismo para criptografia do conteúdo de uma mensagem SOAP, o que evitaria que outros tivessem acesso ao conteúdo da mensagem. Não existe garantia quanto à entrega da mensagem. Quando uma mensagem estiver sendo transferida, se o sistema falhar, ele não saberá como reenviar a mensagem. Um cliente SOAP não pode enviar uma solicitação a vários servidores, sem enviar a solicitação a todos os servidores. Incapacidade de transportar conteudo complexo como arquivos de imagens ou sons Funcionalidades Interoperabilidade entre sistemas utilizando linguagens e protocolos padronizados largamente difundidos, como XML e HTTP. Permite a comunicação entre sistemas protegidos por firewalls, sem precisar abrir portas adicionais e possivelmente não seguras. Ele utiliza (na maioria dos servidores) a porta 80. SOAP descreve completamente cada elemento na mensagem, facilitando o entendimento e a proteção contra erros. Estrutura de uma mensagem SOAP Envelope Soap basea-se na troca de mensagens Mensagens são vistas como envelopes que as aplicações usam para enviar dados Uma mensagem contém dua partes: cabeçalho e corpo. Ambos podem ser divididos em blocos SOAP não especifica o que fazer com o cabeçalho e o corpo. Ele somente diz que o cabeçalho é opcional e o corpo mandatório Entretanto uso do corpo e cabeçalho são implicitos. Corpo define os dados da aplicação e o cabeçalho define a estrutura SOAP header Header Block SOAP Body Body Block Estrutura de uma mensagem <SOAP-ENV:envelope> <!— Elemento raiz do SOAP e define que essa é uma mensagem SOAP> <SOAP-ENV:header> <!—Especifica informações especificas como autenticação (opcional)--> </SOAP-ENV:header> <SOAP-ENV:body> <!—O elemento BODY contém o corpo da mensagem--> <SOAP-ENV:fault> <!—O elemento FAULT contém os erros que podem ocorrer--> </SOAP-ENV:fault> </SOAP-ENV:body> </SOAP-ENV:envelope> Estrutura de uma mensagem Envelope: obrigatório. Define conteúdo da mensagem encodingStyle: atributo que tem como objetivo especificar como as informações devem ser codificadas. <SOAP-ENV:Envelope xmlns:SOAP ENV=”http://schemas.xmlsoap.org/soap/envelope/” SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”> <SOAP-ENV:Header> ... </SOAP-ENV:Header> <SOAP-ENV:Body> … </SOAP-ENV:Body> </SOAP-ENV:Envelope> Estrutura de uma mensagem Header: opcional. Contém os dados do cabeçalho <SOAP-ENV:Envelope xmlns:SOAP ENV=”http://schemas.xmlsoap.org/soap/envelope/” SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”> <SOAP-ENV:Header> <a:authentication xmlns:a=”http://www.foo.com/soap/authentication”> <a:username>Admin</a:username> <a:password>SuperPass</a:password> </a:authentication> </SOAP-ENV:Header> <SOAP-ENV:Body> … </SOAP-ENV:Body> </SOAP-ENV:Envelope> Estrutura de uma mensagem Elemento actor especifica o receptor que deve processar o elemento do cabeçalho. <SOAP-ENV:Envelope xmlns:SOAP ENV=”http://schemas.xmlsoap.org/soap/envelope/” SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”> <SOAP-ENV:Header> <a:authentication xmlns:a=”http://www.foo.com/soap/authentication” SOAP-ENV:actor=”http://www.foo.com/soap/authenticator”> <a:username>Admin</a:username> <a:password>Pass</a:password> </a:authentication> </SOAP-ENV:Header> Estrutura de uma mensagem Elemento mustUnderstand especifica se uma entrada de cabeçalho é obrigatória ou opcional (booleano) Se for acrescido mustUnderstand=“1” a um elemento filho no cabeçalho, indica que o receptor deve reconhecer esse elemento. Se ele não reconhecer deve ser retornada uma falha quando o cabeçalho for processado <SOAP-ENV:Envelope xmlns:SOAP ENV=”http://schemas.xmlsoap.org/soap/envelope/” SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”> <SOAP-ENV:Header> <a:authentication xmlns:a=”http://www.foo.com/soap/authentication” SOAP-ENV:mustUndestrand=”1” <a:username>Admin</a:username> <a:password>Pass</a:password> </a:authentication> </SOAP-ENV:Header> Estrutura de uma mensagem Body: Obrigatório. contém a codificação atual de uma chamada a um método e todos os argumentos de entrada ou uma resposta codificada que contém o resultado de uma chamada de um método. <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soapenvelope" soap:encodingStyle="http://www.w3.org/2001/12/soapencoding"> <soap:Body> <m:GetPrice xmlns:m="http://www.w3schools.com/prices"> <m:Item>Apples</m:Item> </m:GetPrice> </soap:Body> </soap:Envelope> Estrutura de uma mensagem Resposta da requisição <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soapenvelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices"> <m:Price>1.90</m:Price> </m:GetPriceResponse> </soap:Body> </soap:Envelope> Estrutura de uma mensagem Elemento Fault: contém as informações dos erros ocorridos no envio da mensagem. Apenas nas mensagens de resposta do servidor. Se o elemento Fault existe ele deve aparecer como um elemento filho do elemento Body. Elemento Fault pode aparecer apenas uma vez em uma mensagem SOAP Estrutura de uma mensagem Elemento Fault: Possui os seguintes subelemento <faultcode> Para identificar o código da falta <faultstring> Descriçao da falta <faultactor> Informação de quem originou a falta <detail> Informações específicas de erro relacionada ao elemento Body Estrutura de uma mensagem Alguns exemplos de erros: Error: VersionMismatch Description: Encontrado um namespace invalido no envelope SOAP Error: MustUnderstan Description: Um elemento filho do elemento Header com o atributo mustUnderstand=“1” não foi entendido Error: Client Description: A mensagem foi formada incorretamente ou contém informações incorretas Error: Server Description: processada Problemas com o servidor. Mensagem não pode ser Ligação SOAP + HTTP Requisição HTTP POST /item HTTP/1.1 Host: 189.123.345.239 Content-Type: text/plain Content-Length: 200 Uma requisição SOAP é uma requisição HTTP que usa o padrão de request/response definido pelas regras de codificação SOAP HTTP + XML = SOAP Uma requisição SOAP pode ser feita através de POST ou GET Ligação SOAP + HTTP POST /InStock HTTP/1.1 Host: www.stock.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap=http://www.w3.org/2001/12/soap-envelope soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.stock.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope Exemplo de uma requisição Ligação SOAP + HTTP HTTP/1.1 200 OK Content-Type: application/soap; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.stock.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope> Exemplo de resposta da requisição