É uma especificação de protocolo de mensagens para troca de informações estruturadas em um ambiente descentralizado e distribuído. Sua finalidade é fornecer extensibilidade, neutralidade e independência. Ele usa o XML para seu formato de mensagem e se baseia nos protocolos da camada de aplicação na maioria das vezes o Hypertext Transfer Protocol (HTTP) para negociação e transmissão de mensagens.
Permite que processos executados em sistemas operacionais diferentes (como Windows e Linux) se comuniquem usando XML (Extensible Markup Language). Como os protocolos da Web (HTTP, SMTP, etc), são instalados e executados em todos os sistemas operacionais, o SOAP permite que os clientes invoquem web services e recebam respostas independentemente das linguagens de programação e da plataforma.
A característica de neutralidade do SOAP o torna adequado para uso com qualquer protocolo de transporte. Implementações geralmente usam HTTP, mas outros protocolos de transporte populares podem ser usados. Por exemplo, o SOAP também pode ser usado em SMTP, JMS e filas de mensagens.
Quando combinado com o protocolo HTTP, consequentemente não exige a modificação das infraestruturas de computação e comunicação existentes.
Utiliza XML dessa forma incluindo todas as suas vantagens como por exemplo fácil internacionalização e extensibilidade com XML Namespaces.
A verbosidade do protocolo, a velocidade de análise lenta do XML e a falta de um modelo de interação padronizado levaram à dominação no campo por serviços que usam o protocolo HTTP mais diretamente como o REST.
SOAP processing model: define as regras para processar uma SOAP message.
SOAP extensibility model: define o modelo de extensão com o conceitos de SOAP features e SOAP modules.
SOAP underlying protocol binding: estrutura descrevendo as regras para definir uma ligação a um protocolo subjacente que pode ser usado para trocar SOAP messages entre SOAP nodes
SOAP message construct: definindo a estrutura de uma SOAP message

SOAP: O conjunto de regras que formaliza e rege o formato e as regras de processamento de informações trocadas entre um SOAP sender e um SOAP receiver.
SOAP nodes: São máquinas físicas ou lógicas com unidades de processamento que são usadas para encaminhar, receber e processar mensagens SOAP. Estes são análogos aos nós de rede.
SOAP role: No SOAP message path, todos os nodes assumem uma role específica. A role do node define a ação que será executa na mensagem que ele recebe de acordo com o SOAP header.
SOAP binding: Uma mensagem SOAP precisa trabalhar em conjunto com outros protocolos para serem transferidos através de uma rede. Por exemplo, uma mensagem SOAP pode usar o TCP como um protocolo de camada inferior para transferir mensagens. Essas ligações são definidas na SOAP protocol binding framework.
SOAP feature: SOAP fornece apenas uma estrutura de mensagens. No entanto, ele pode ser estendido para adicionar recursos como confiabilidade, segurança, etc. Há regras a serem seguidas ao adicionar recursos à estrutura SOAP.
SOAP module: É uma especificação que contem a combinação da sintaxe e semântica de um ou mais SOAP header para descrever quaisquer novos features sendo estendidos no SOAP. Um module precisa realizar zero ou mais features. O SOAP exige que os modules sigam as regras prescritas.
SOAP message exchange pattern (MEP): Template para a troca de SOAP messages entre SOAP nodes que é possibilitado pelo SOAP protocol bindings.
SOAP application: Uma entidade, tipicamente de software, que produz, consume ou age em SOAP messages em conformidade com o SOAP processing model.
SOAP message: Representa as informações trocadas entre 2 SOAP nodes.
SOAP envelope: É o elemento envolvente de uma mensagem XML identificando-a como SOAP message.
SOAP header: Uma coleção de zero ou mais SOAP header blocks cada qual pode ser selecionado por qualquer SOAP receiver dentro do SOAP message path.
SOAP header block: Um SOAP header pode conter mais de um desses blocos, cada um sendo um bloco computacional discreto dentro do header. Em geral, as informações do SOAP role são usadas para segmentar nodes no caminho (message path). Um header block é direcionado a um ou mais SOAP nodes se a header block tiver o mesmo nome que uma rolo na qual o node opera.
SOAP body: Contém o corpo da mensagem destinada ao SOAP receiver. A interpretação e o processamento do SOAP body são definidos pelos header block.
SOAP fault: No caso de um SOAP node falhar ao processar uma SOAP message, ele incluirá as informações de falha no elemento de falha SOAP. Esse elemento está contido no SOAP body como um elemento filho.
SOAP sender: O SOAP node que transmite uma SOAP message.
SOAP receiver: O SOAP node que está recebendo uma SOAP message.
SOAP message path: O caminho que consiste em todos os nodes que a SOAP message atravessou para alcançar o node de destino.
Initial SOAP sender: Este é o node que originou a SOAP message a ser transmitida. Esta é a raiz do SOAP message path.
SOAP intermediary: todos os nós entre o Initial SOAP sender e o destino SOAP pretendido. Ele processa os SOAP header blocks direcionados a ele e age para encaminhar uma SOAP message em direção a um Ultimate SOAP receiver.
Ultimate SOAP receiver: O receptor de destino da SOAP message. Este node é responsável por processar o body da message e quaisquer header blocks direcionados a ele.
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="http://www.example.org">
<soap:Header>
</soap:Header>
<soap:Body>
<m:GetStockPrice>
<m:StockName>GOOG</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>É uma linguagem de descrição de interface baseada em XML que é usada para descrever a funcionalidade oferecida por um serviço da Web.
O WSDL é frequentemente usado em combinação com o SOAP e um XML Schema para fornecer serviços da Web pela Internet.

Service: Contém um conjunto de funções de sistema que são expostas utilizando protocolos Web.
Port/Endpoint: Determina os endereços ou pontos de conexão a um web service. É geralmente representada por uma HTTP URL string.
Binding: Especifica a interface e define o SOAP binding style (RPC/Document) e o SOAP transport (SOAP Protocol). Ela também define as operações suportadas.
PortType/Interface: Define um Web service, as operações que podem ser executadas,e as mensagens que são usadas para executar a operação.
Operation: Define as SOAP actions e o modo como a mensagem é codificada. Uma operação é como um método ou função em estilos tradicionais de programação.
Message: Determinar os dados que serão trocados entre o provedor do web service e seus consumidores. A mensagem contem as informações necessárias para executar a operação e os dados que serão retornados para o consumidor.
Types: Definem os tipos de dados que serão utilizados nos web services. A XML Schema language (XSD) é usada para esse propósito.
Ao usar contrato primeiro, você começa com a definição das interfaces do artefato de software (o contrato WSDL, XSD nesse caso) e gera o código fonte com a implementação do contrato.
Ao usar uma abordagem de contrato por último, você começa com o código fonte e gerada o contrato de serviço da Web (WSDL) a partir do código.
Fragilidade: O uso de geradores em objetos de código podem gerar WSDL diferentes caso alguma mudança seja realizada no código fonte. Além disso geradores diferentes podem gerar WSDL diferentes.
Performance: A geração automática do WSDL nem sempre leva em consideração performance da deserialização/serialização de objetos. O uso do Contract-first possibilita a criação de WSDL e XSD otimizados.
Reusabilidade: A criação dos WSDL e XML Schemas permite que eles possam ser reutilizados, no lugar de serem gerados toda ves que a aplicação mudar.
Versionamento: Mesmo que um contrato deve permanecer imutável pelo maior período de tempo possível, as vezes eles precisam mudar. O uso do Contract-first permite o desacoplamento entre contrato e implementação.
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://www.w3.org/ns/wsdl"
xmlns:tns="http://www.tmsws.com/wsdl20sample"
xmlns:whttp="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://www.tmsws.com/wsdl20sample">
<documentation>
This is a sample WSDL 2.0 document.
</documentation>
<!-- Abstract type -->
<types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.tmsws.com/wsdl20sample"
targetNamespace="http://www.example.com/wsdl20sample">
<xs:element name="request"> ... </xs:element>
<xs:element name="response"> ... </xs:element>
</xs:schema>
</types>
<!-- Abstract interfaces -->
<interface name="Interface1">
<fault name="Error1" element="tns:response"/>
<operation name="Get" pattern="http://www.w3.org/ns/wsdl/in-out">
<input messageLabel="In" element="tns:request"/>
<output messageLabel="Out" element="tns:response"/>
</operation>
</interface>
<!-- Concrete Binding Over HTTP -->
<binding name="HttpBinding" interface="tns:Interface1"
type="http://www.w3.org/ns/wsdl/http">
<operation ref="tns:Get" whttp:method="GET"/>
</binding>
<!-- Concrete Binding with SOAP-->
<binding name="SoapBinding" interface="tns:Interface1"
type="http://www.w3.org/ns/wsdl/soap"
wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"
wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request-response">
<operation ref="tns:Get" />
</binding>
<!-- Web Service offering endpoints for both bindings-->
<service name="Service1" interface="tns:Interface1">
<endpoint name="HttpEndpoint"
binding="tns:HttpBinding"
address="http://www.example.com/rest/"/>
<endpoint name="SoapEndpoint"
binding="tns:SoapBinding"
address="http://www.example.com/soap/"/>
</service>
</description>XSD (XML Schema Definition), uma recomendação do World Wide Web Consortium (W3C), especifica como descrever formalmente os elementos em um documento XML (Extensible Markup Language).
Tecnicamente, um esquema é uma coleção abstrata de metadados, consistindo em um conjunto de componentes do esquema.
Element declarations: definem as propriedades dos elementos. Estes incluem o nome do elemento e o espaço de nomes de destino. Uma propriedade importante é o tipo do elemento, que restringe quais atributos e filhos que o elemento pode ter.
Attribute declarations: definem propriedades de atributos. Novamente, as propriedades incluem o nome do atributo e o espaço de nomes de destino. O tipo de atributo restringe os valores que o atributo pode assumir. Uma declaração de atributo também pode incluir um valor padrão ou um valor fixo.
Elementos podem ter tipos simples ou complexos:
Complex types: tipos complexos são elementos que são compostos por outros elementos e atributos.
Simple types: tipos simples são elementos com valores finais.
Model group and attribute group definitions: grupos nomeados de elementos e atributos que podem ser reutilizados em muitas definições de tipos diferentes.
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</country>
</shipto>time
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder><?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>É uma extensão do SOAP para aplicar segurança a serviços da Web. O protocolo especifica como a integridade e a confidencialidade podem ser aplicadas em mensagens permitindo a comunicação com vários formatos de token de segurança, como SAML (Security Assertion Markup Language), Kerberos e X.509. Seu foco principal é o uso de XML Signature e XML Encryption para fornecer segurança de ponta a ponta.
É construído por:
Como assinar mensagens SOAP para garantir a integridade.
Como criptografar mensagens SOAP para garantir a confidencialidade.
Como anexar tokens de segurança para determinar a identidade do remetente.
A especificação permite uma variedade de formatos de assinatura, algoritmos de criptografia e vários domínios de confiança e está aberta a vários modelos de token de segurança, como:
|
|
<WSS:Envelope xmlns:WSS="..." xmlns:wsse="...">
<WSS:Header>
...
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>Zoe</wsse:Username>
<wsse:Password>IloveDogs</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
...
</WSS:Header>
...
</WSS:Envelope>