• Sonuç bulunamadı

B.1 SOAP

SOAP (Simple Object Access Protocol) [Mitra, 2003] é o protocolo de comu- nicação, baseado em XML e padronizado pela W3C, utilizado pelos serviços Web para codificar as mensagens entre o serviço Web e o cliente. Pelo fato de ser baseado em XML ele é independente de plataforma e linguagem de programação.

SOAP tem uma sintaxe simples e flexível, normalmente é encapsulado em uma mensagem HTTP, porém pode ser utilizado em conjunto com outros protocolos como JMS (Java Message Service) [Microsystems, 1998] e SMTP (Simple Mail Transport Protocol) [Easton et al., 2008]. SOAP pode ser transmitido facilmente pela Internet sem que o desenvolvedor preocupe-se com os bloqueios impostos por alguns firewalls e proxys. Entretanto, por causa do formato XML, SOAP pode ser consideravelmente mais lento do que outras tecnologias como CORBA. Porém, quando um número reduzido de mensagens ou mensagens pequenas são transmitidas, este problema é minimizado.

Uma mensagem SOAP é um documento XML que contém os seguintes elemen- tos:

• Um elemento Envelope que identifica o documento XML como uma mensagem SOAP;

• Um elemento Header que contém informações de cabeçalho da mensagem SOAP, normalmente específicas da aplicação, como por exemplo, informações de auten- ticação. O elemento Header de uma mensagem SOAP é opcional e se ele estiver presente na mensagem, ele deve ser o primeiro filho do elemento Envelope;

• Um elemento Body que contém informações de chamadas e respostas dos pares envolvidos na comunicação, ou seja, o cliente e o serviço Web;

• Um elemento Fault que pode conter informações de erros e status.

Para efeito de demonstração considere o seguinte método na linguagem Java que representa a assinatura de uma operação de um serviço Web:

Apêndice B 124

PumpUnit unit);

O retorno do método subscribeBurdenAssyncService é definido como um objeto Regime. Este objeto é um POJO1que contém os atributos burden, cpm, idRegime e stemSize, todos do tipo String.

O trecho de Código B.1 ilustra a mensagem SOAP de resposta a uma requisição ao serviço Web subscribeBurdenAssyncService. As linhas 1 a 5 determinam o cabeçalho da mensagem do protocolo HTTP e, logo em seguida, na linha 6 existe uma linha em branco que separa o cabeçalho do corpo da mensagem HTTP. A mensagem SOAP é encapsulada dentro do corpo da mensagem HTTP, conforme podemos observar a partir da linha 7 até o fim do documento.

A mensagem SOAP inicia-se com a seguinte declaração XML: <?xml version=’1.0’ encoding=’utf-8’?>

que identifica o documento como um documento XML com o tipo de codificação UTF-8 Unicode.

O atributo xmlns, do XML Schema, é usado para declarar ligações de namespace com prefixos, conforme o caso do prefixo ns na linha 11. Dessa forma,os atributos xmlns:soapenv e soapenv:encodingStyle do elemento Envelope são utilizados para declarar, respectivamente os namespaces para o Envelope SOAP e os tipos de dados (data types). No trecho de Código B.1 temos apenas a declaração do namespace para o elemento Envelope, representado da linha 9. O namespace para os tipos de dados pode ser declarado em qualquer elemento da mensagem SOAP, sendo que sua visibilidade será para o conteúdo do elemento e para seus filhos.

1Plain Old Java Object - um objeto Java que contém apenas atributos e não implementa nenhuma

Apêndice B 125

Código B.1 Exemplo de Mensagem SOAP de Resposta

1 HTTP/1.1 200 OK

2 Server: Apache-Coyote/1.1

3 Content-Type: text/xml;charset=utf-8 4 Date: Mon, 31 Oct 2011 02:25:25 GMT 5 Connection: close 6 7 <?xml version=’1.0’ encoding=’utf-8’?> 8 <soapenv:Envelope 9 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 10 <soapenv:Body> 11 <ns:subscribeBurdenAssyncServiceResponse xmlns:ns="http://service/xsd"> 12 <ns:return xmlns:ax29="http://model/xsd" 13 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 14 xsi:type="ax29:Regime"> 15 <ax29:burden>0</ax29:burden> 16 <ax29:cpm xsi:nil="true" /> 17 <ax29:idRegime xsi:nil="true" /> 18 <ax29:stemSize xsi:nil="true" /> 19 </ns:return> 20 </ns:subscribeBurdenAssyncServiceResponse> 21 </soapenv:Body> 22 </soapenv:Envelope>

O elemento Body inicia-se na linha 10 e termina na linha 21 do trecho de Código B.1. O elemento Body contém um subelemento (linha 11) ns:subscribeBurdenAssyncServiceResponse, onde é declarado o namespace http://service/xsd que está associado ao prefixo ns. Todos os elementos dos names- paces http://service/xsd e http://model/xsd estão definidos no arquivo WSDL do serviço Web. Nas linhas 12 e 13 existem duas outras declarações de namespaces, http://model/xsd e

http://www.w3.org/2001/XMLSchema-instance, respectivamente associados aos prefixos ax29 e xsi. Esses namespaces possuem visibilidade em cima do elemento ns:return e seus filhos. Na linha 14 o atributo xsi:type é usado para identificar tipos complexos derivados. Ele aponta para uma referência do Schema que define o seu tipo. Neste caso, ax29:Regime corresponde ao identificador http://model/xsd/Regine. Logo, pode-se con- cluir que, ns:return é um tipo http://model/xsd/Regime que está declarado no documento WSDL do serviço Web.

Apêndice B 126

valor associado para o elemento burden é 0 enquanto que para os demais não existe valor associado, porém a mensagem SOAP continua válida, pois um elemento da mensagem SOAP que não contém conteúdo pode ser válido se ele tem o atributo xsi:nil com o valor true.

As linhas 19 e 20 definem as marcações XML para fechar a especificação dos elementos ns:return e ns:subscribeBurdenAssyncServiceResponse. Já na linha 21 e 22 os elementos Body e Envelope da mensagem SOAP são fechados.

A mensagem SOAP associada a requisição do serviço pode ser visualizada no trecho de Código B.2.

Código B.2 Exemplo de Mensagem SOAP de Requisição

1 POST /axis2/services/WellDatabase.WellDatabaseHttpSoap11Endpoint/ HTTP/1.0 2 Content-Type: text/xml; charset=utf-8

3 Accept: application/soap+xml, application/dime, multipart/related, text/* 4 User-Agent: Axis/1.4 5 Host: localhost:8081 6 Cache-Control: no-cache 7 Pragma: no-cache 8 SOAPAction: "urn:subscribeBurdenAssyncService" 9 Content-Length: 444 10 X-Forwarded-For: 127.0.0.1 11 12 <?xml version="1.0" encoding="UTF-8"?> 13 <soapenv:Envelope 14 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 15 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 16 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 17 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 18 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 19 <soapenv:Body> 20 <subscribeBurdenAssyncService xmlns="http://service/xsd" /> 21 </soapenv:Body> 22 </soapenv:Envelope> 23

A primeira linha do trecho de Código B.2 ilustra a requisição do protocolo HTTP. A mensagem SOAP foi encapsulada dentro de uma requisição HTTP do tipo POST para o EndPoint do serviço Web.

A declaração dos elementos e a estrutura da mensagem SOAP de requisição é semelhante a mensagem SOAP de resposta. Na linha 18 a declaração do atributo so-

Apêndice B 127

apenv:encodingStyle estabelece o namespace para os tipos de dados (data types) do elemento Envelope. Na linha 20 é definido o elemento subscribeBurdenAssyncService. Ele é o parâmetro para o serviço Web e sua estrutura está definida no names- pace http://service/xsd que foi especificado no arquivo WSDL. O trecho de Có- digo B.3 ilustra uma parte do documento WSDL que define o tipo complexo subscribeBurdenAssyncService.

Código B.3 Definição do tipo complexo subscribeBurdenAssyncService

1 ...

2 <wsdl:types>

3 <xs:schema xmlns:ax210="http://model/xsd" attributeFormDefault="qualified" 4 elementFormDefault="qualified" targetNamespace="http://service/xsd">

5 <xs:element name="subscribeBurdenAssyncService"> 6 <xs:complexType>

7 <xs:sequence>

8 <xs:element minOccurs="0" name="well" nillable="true" 9 type="ax210:OilWell"/>

10 <xs:element minOccurs="0" name="unit" nillable="true" 11 type="ax210:PumpUnit"/> 12 </xs:sequence> 13 </xs:complexType> 14 </xs:element> 15 </xs:schema> 16 ... 17 </wsdl:types> 18 ...

Os parâmetros OilWell e PumpUnit de subscribeBurdenAssyncService podem as- sumir valores null. Desta forma, conforme podemos observar na mensagem de requisição SOAP, nenhum valor é especificado para estes atributos.

B.2 WSDL

WSDL (Web Service Definition Language) é a linguagem baseada em XML utilizada para descrever o serviço Web. WSDL define um contrato entre o requisitante do serviço e o seu provedor a partir da descrição de quatro aspectos relacionados ao serviço Web:

Apêndice B 128

Data type são informações que descrevem os tipos de dados para todas as mensagens de requisição ou resposta;

Binding descreve o tipo de protocolo de transporte a ser utilizado; Address contém informações para localizar um determinado serviço.

A versão atual da especificação WSDL é a 1.2, renomeada para 2.0 devido às diferenças substancias para a versão 1.1. Entretanto, várias ferramentas e frameworks ainda adotam a versão 1.1. Neste trabalho utilizaremos a versão 1.1 da especificação WSDL por motivos de compatibilidade com nosso estudo de caso, a plataforma Open- COPI [Lopes et al., 2008, Lopes et al., 2009a, Lopes et al., 2009b] que utiliza a lingua- gem OWL-S na versão 1.1, que é compatível somente com a especificação WSDL 1.1.

WSDL é dividida em oito principais elementos: Definition, Types, Message, Operation, Port Type, Binding, Port, Service. A Figura B.1 ilustra os elementos da WSDL e suas relações.

Figura B.1: Elementos do WSDL 1.1

Definition É o elemento WSDL root que engloba todos os demais elementos. Nele é declarado todos os namespaces utilizados no documento WSDL.

Types É um contêiner para os tipos de dados definidos e utilizados pelos clientes e o serviço Web. WSDL utiliza a especificação do Schema XML W3C como o sistema de tipos padrão. Isto significa que para um determinado serviço Web que utiliza apenas tipos definidos no Schema XML, como por exemplo, os tipos String e Integer, o elemento types da especificação deste serviço Web não é necessário.

Apêndice B 129

Message Define quais são as mensagens que serão transmitidas entre o cliente e o serviço Web. Um elemento message contém informações necessárias para executar uma operação do serviço Web. O elemento message tem um nome único, definido pela propriedade name, que é utilizado para identificar unicamente cada mensagem. O elemento message pode ser composto por zero ou mais elementos do tipo part, que referenciam os parâmetros ou retorno das mensagens. Cada elemento part oferece uma descrição lógica de uma parte do conteúdo de um elemento message e também contém um identificador único, definido pela propriedade name .

Operation Oferece uma descrição abstrata de uma ação suportada pelo serviço. Quando estiver dentro do elemento portType ele especifica a “assinatura” do método/ope- ração do serviço Web. Já quando está dentro do elemento binding ele define como as mensagens SOAP serão codificadas. As mensagens podem ser do tipo RPC ou Document. O elemento operation também define a natureza da operação e o seu comportamento com o Endpoint associado. Existem quatro possíveis tipos:

one-way o Endpoint da operação pode receber uma mensagem de requisição porém não retorna nenhuma mensagem;

request-response o Endpoint da operação pode receber uma mensagem de requi- sição e sempre retorna uma mensagem de resposta;

solicit-response o Endpoint da operação pode enviar uma mensagem de requisição e irá esperar por uma resposta;

notification o Endpoint da operação pode enviar uma mensagem, mas não irá esperar por uma resposta.

Port Type Este elemento WSDL oferece uma abstração das operações suportadas pelos Endpoints definidos pelo serviço Web. O elemento portType combina múltiplos elementos message para formar todas as mensagens possíveis envolvidas em uma operação do serviço Web. Por exemplo, em uma operação do tipo request-response o elemento portType combina um elemento message para a requisição e outro para a resposta.

Binding Oferece o protocolo e a especificação do formato dos dados para um elemento portTypeem particular. Ele determina como as mensagens podem ser transmitidas a partir da especificação do estilo das mensagens SOAP (RPC ou Document) e do protocolo de aplicação utilizado para o transporte da mensagem SOAP, normalmente HTTP.

Port Este elemento define o endereço de um EndPoint do serviço Web. Normalmente ele é representado por um URL HTTP, combinando o binding e o protocolo a ser utilizado.

Service É uma coleção de elementos do tipo port. O elemento service expõe a localização de todos os EndPoints do serviço Web.

Apêndice B 130

Um documento WSDL pode conter outros elementos além desses especificados. Por exemplo, no caso de operações do tipo solicit-response ou notification é necessário especificar extensões do elemento binding para permitir sua utilização. O propósito desse documento não é apresentar toda especificação WSDL, somente os conceitos mais importantes e relevantes para condução do trabalho. A especificação completa do WSDL pode ser obtida em [Christensen et al., 2001].

O trecho de Código B.4 apresenta a definição dos elementos message do docu- mento WSDL para o serviço Web subscribeBurdenAssyncService. O elemento message subscribeBurdenAssyncServiceRequest é composto por um elemento part que está defi- nido pelo tipo complexo subscribeBurdenAssyncService, ilustrado no Código B.3. Código B.4 Definição do elemento message

1 ...

2 <wsdl:message name="subscribeBurdenAssyncServiceRequest">

3 <wsdl:part name="parameters" element="ns:subscribeBurdenAssyncService"/> 4 </wsdl:message>

5 <wsdl:message name="subscribeBurdenAssyncServiceResponse">

6 <wsdl:part name="parameters" element="ns:subscribeBurdenAssyncServiceResponse"/> 7 </wsdl:message>

8 ... 9

O elemento portType do serviço Web têm o nome WellDatabasePortType e está ilustrado no trecho de Código B.5. O elemento portType juntamente com operation especificam a operação subscribeBurdenAssyncService utilizando os elementos message que foram definidos anteriormente. A operação em questão é do tipo request-response. Código B.5 Definição do elemento portType

1 ... 2 <wsdl:portType name="WellDatabasePortType"> 3 <wsdl:operation name="subscribeBurdenAssyncService"> 4 <wsdl:input message="axis2:subscribeBurdenAssyncServiceRequest" 5 wsaw:Action="urn:subscribeBurdenAssyncService"/> 6 <wsdl:output message="axis2:subscribeBurdenAssyncServiceResponse" 7 wsaw:Action="urn:subscribeBurdenAssyncServiceResponse"/> 8 </wsdl:operation> 9 </wsdl:portType> 10 ... 11

O elemento binding tem dois atributos, name e type. O atributo name de- fine o nome do binding, neste caso WellDatabaseSoap11Binding, enquanto que o atri- buto type aponta para o elemento portType WellDatabasePortType. O elemento interno

Apêndice B 131

soap:binding define que o protocolo HTTP será utilizado para transportar as mensa- gens SOAP que estão codificadas com o estilo document, conforme o Código B.6 ilustra. É possível observar também que o elemento binding exporta qual é a opera- ção subscribeBurdenAssyncService e define o tipo de codificação para os seus inputs e outputs.

Código B.6 Definição do elemento binding

1 ...

2 <wsdl:binding name="WellDatabaseSoap11Binding" type="axis2:WellDatabasePortType"> 3 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" 4 style="document"/> 5 <wsdl:operation name="subscribeBurdenAssyncService"> 6 <soap:operation soapAction="urn:subscribeBurdenAssyncService" 7 style="document"/> 8 <wsdl:input> 9 <soap:body use="literal"/> 10 </wsdl:input> 11 <wsdl:output> 12 <soap:body use="literal"/> 13 </wsdl:output> 14 </wsdl:operation> 15 </wsdl:binding> 16 ... 17

WSDL especifica a interface de um serviço Web, mas se não existir meios para alcançá-lo, o serviço não será utilizado. Uma solução para o compartilhamento de serviços Web é o UDDI, apresentado na próxima seção.

B.3 UDDI

Universal Description Discovery and Integration (UDDI) é a especificação de um diretório de serviços onde é possível registrar e buscar serviços Web. O UDDI é baseado em XML, utiliza o protocolo SOAP para comunicação e WSDL para descrição dos serviços Web.

O UDDI Business Registry é uma implementação da especificação UDDI que permite busca por dados UDDI e também o registro de organizações e seus serviços. Os dados de registro de cada organização são divididos em três principais categorias:

Apêndice B 132

White Pages inclui informações gerais de uma organização tais como endereço, nome da empresa, descrição do negócio da empresa, etc;

Yellow Pages inclui dados de classificação gerais, baseados em uma taxonomia padrão para cada organização ou serviço oferecido;

Green Pages contêm informações técnicas sobre os serviços expostos pelas organiza- ções.

O UDDI somente categoriza seus registros. Ele não estrutura os registros seman- ticamente a partir da atribuição de um significado a cada registro. Esta é a sua grande desvantagem. Aplicações invocam diretamente os arquivos WSDL em detrimento à utili- zação das APIs (Application Programm Interface) baseadas em palavra-chave para busca no UDDI.

B.4 Apache Axis2

Axis2 [Perera et al., 2006] é um framework Open Source desenvolvimento pela Apache para criação de serviços Web. O framework contém várias APIs e utilitários que ajudam o desenvolvimento de serviços Web. Dentre as funcionalidades providas pelo Axis2 duas delas são usadas diretamente neste trabalho:

java2wsdl - um mecanismo para transformar os métodos públicos de uma classe Java em operações de um serviço Web. Este mecanismo automaticamente deriva os tipos complexos do arquivo WSDL a partir da assinatura dos métodos.

wsdl2java - um mecanismo para criar implementação de classes para comunicação com o serviço descrito em um documento WSDL.

Axis2 implementa a especificação SOAP e cria stubs e skeletons para o serviço Web automaticamente. No contexto deste trabalho Axis2 é utilizado para criar serviços Web. Desta forma, a especificação da interface do serviço Web modelada a partir do profile UML deve ser transformada para uma classe Java e enviada para o framework Axis2 para que ele gere o serviço Web correspondente.

APÊNDICE

C

Benzer Belgeler