Durante o desenvolvimento de um cliente de Web Services é muito comum necessitarmos enviar mensagens de teste ao servidor, necessitando a alteração rápida do conteúdo, podendo inclusive inserir novas tags. Esse tipo de alteração também é útil durante a identificação de problemas relacionados a classe TWsdlManager, que pode não identificar corretamente algum elemento o tipo declarado no WSDL.
Para tanto podemos utilizar o recurso de envio de mensagens personalizadas da classe TWsdlManager, através do método SendSoapMsg. A mensagem deve ser montada em uma variável do tipo caractere e será enviada ao servidor sem qualquer tipo de verificação prévia. A variável caractere com a mensagem pode ser manipulada livremente.
Para mais informações sobre o envio, verifique a documentação do método SendSoapMsg. Abaixo podemos ver um exemplo de envio de mensagem personalizada enviada a um servidor.
User Function Teste()
Local oWsdl
Local xRet
Local cMsg := ""
// Cria o objeto da classe TWsdlManager
oWsdl := TWsdlManager():New()
// Faz o parse de uma URL
xRet := oWsdl:ParseURL( "http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL" )
if xRet == .F.
conout( "Erro: " + oWsdl:cError )
return .F.
endif
// Define a operação
xRet := oWsdl:SetOperation( "GetCityForecastByZIP" )
if xRet == .F.
conout( "Erro: " + oWsdl:cError )
Return
endif
// Monta uma mensagem SOAP personalizada
cMsg := "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>"
cMsg += '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" '
cMsg += 'xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" '
cMsg += 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" '
cMsg += 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
cMsg += 'xmlns:ns1="http://ws.cdyne.com/WeatherWS/">'
cMsg += '<SOAP-ENV:Body>'
cMsg += '<GetCityForecastByZIP xmlns="http://ws.cdyne.com/WeatherWS/">'
cMsg += '<ZIP>22313</ZIP>'
cMsg += '</GetCityForecastByZIP>'
cMsg += '</SOAP-ENV:Body>'
cMsg += '</SOAP-ENV:Envelope>'
// Envia uma mensagem SOAP personalizada ao servidor
xRet := oWsdl:SendSoapMsg( cMsg )
if xRet == .F.
conout( "Erro: " + oWsdl:cError )
return .F.
endif
return .T.