Esses dias tive um problema com um projeto da Índia. O cliente, ao realizar a chamada pra um serviço que eu desenvolvi, recebia o seguinte erro:
A required header representing a Message Addressing Property is not present
Os testes realizados no SOAP-UI e cliente WS criado não apresentavam nenhum erro, então ficava difícil simular o ocorrido. Pela mensagem informada, podemos ter dois tipos de erro:
- O cliente está adicionando um header na requisição inválido
- Ou o servidor está esperando um header que o cliente não enviou
Fui investigar os headers gerados pelo SOA Suite e por padrão ele adiciona o header de WS-Addressing:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"> <env:Header> <wsa:MessageID>urn:8C092A70319311E1BF0C3FD5A35C8139</wsa:MessageID> <wsa:ReplyTo> <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address> </wsa:ReplyTo> </env:Header> <env:Body> <autorizaResponse xmlns="http://www.thiagovespa.com.br/transacao"> <Token>1232d333038383938353637323530363538321</Token> </autorizaResponse> </env:Body> </env:Envelope>
Da linha 3 a 6 podemos observar que o SOA Suite adicionou o header do WS-Addressing na resposta. Para desabilitar é necessário incluir dois parâmetros no binding dos serviços. No JDeveloper isso pode ser feito abrindo o composite.xml, selecionando o serviço na lateral esquerda (Exposed Services) e no Property Inspector (Ctrl+Shift+I), adicionar duas novas propriedades do binding (Binding Properties):
- oracle.soa.ws.outbound.omitWSA - valor: true
- oracle.soa.addressing.response.enabled - valor: false
A propriedade oracle.soa.ws.outbound.omitWSA como true irá remover a necessidade do header na requisição e a propriedade oracle.soa.addressing.response.enabled como false irá remover a geração do header na resposta. O código fonte do composite.xml deverá ficar com o binding mais ou menos igual à esse:
<binding.ws port="http://www.thiagovespa.com.br/transacao#wsdl.endpoint(testebpelprocess_client_ep/transacaoSoap_pt)"> <property name="oracle.soa.ws.outbound.omitWSA" type="xs:string" many="false" override="may">true</property> <property name="oracle.soa.addressing.response.enabled" type="xs:string" many="false" override="may">false</property> </binding.ws>
Agora é só executar e você terá uma resposta sem o header do WS-Addressing:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header/> <env:Body> <autorizaResponse xmlns="http://www.thiagovespa.com.br/transacao"> <Token>12335353638353935333535383732333032321</Token> </autorizaResponse> </env:Body> </env:Envelope>
O cliente que não tinha suporte ao WS-Addressing irá funcionar sem mais problemas.