Repository navigation
cliente soap
Home > Cliente SOAP
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Nível: iniciante
Em uma frase: o TRALSOAPClient chama serviços SOAP 1.1 e 1.2 - do RAL ou
de qualquer outro (.NET, WCF, Java) - a partir do WSDL, sem escrever o
envelope.
Você vai precisar: RAL 2.0 com os pacotes RALModuleXMLPackage e
RALModuleSOAPPackage (Instalação).
O TRALSOAPClient é um TRALClient: herda motores (EngineType),
BaseURL com failover, TLS e pins, pool de conexões, autenticação e
compressão. Use-o para serviços SOAP; para REST continue com o TRALClient.
Nada mudou no TRALClient.
- Coloque um
TRALSOAPClient(paleta RAL - Client) e escolha oEngineType, como no cliente. - Clique com o botão direito no componente e escolha Importar WSDL....
Informe o endereço (
http://servidor/calc?wsdl) ou um arquivo. O cliente preencheOperations,Namespace,BaseURLeServicePath. - Em
Operations, cada operação temParams(os valores de entrada, com tipo) eResults(os de saída). Preencha oValuedosParamsno Object Inspector, se quiser valores fixos. - Para chamar sem código: coloque um
TActionList, acrescente a ação TRALSOAPExecute (categoria RAL), aponteClienteOperatione ligue um botão à ação. - Se a resposta traz um dataset, ligue
ResultDataSetda operação a um memtable do formulário: ele é carregado a cada resposta.
with RALSOAPClient1.Operations['Somar'] do
begin
Params['a'].Value := '2';
Params['b'].Value := '3';
if Execute then
ShowMessage(Results.ValueOf('SomarResult'));
end;Execute devolve True quando a resposta chegou e preencheu Results (e o
ResultDataSet). Response guarda o envelope da última resposta, para ler o
que Results não mostra:
Doc := RALSOAPClient1.Operations['Somar'].Response;
Total := Doc.GetText('/Envelope/Body/SomarResponse/SomarResult');Um parâmetro opcional com Value vazio não é enviado; um obrigatório
(Required) vai mesmo vazio.
Execute(ebMultiThread) volta na hora; a resposta chega depois, na thread
principal, em Results, ResultDataSet e nos eventos. A ação
TRALSOAPExecute tem ExecBehavior para o mesmo.
Doc := RALSOAPClient1.CallXML('Somar', '<Somar xmlns="urn:calc"><a>7</a><b>8</b></Somar>');
try
ShowMessage(Doc.GetText('/Envelope/Body/SomarResponse/SomarResult'));
finally
Doc.Free;
end;Call(operacao, no) faz o mesmo com um nó montado pela API do XML.
Uma Fault do serviço chega em OnFault (da operação ou do cliente) com
Code, CodeText, Reason, Detail e HTTPStatus. Sem nenhum evento,
Execute levanta ERALSOAPFault:
try
RALSOAPClient1.Execute('Somar');
except
on E: ERALSOAPFault do
ShowMessage(E.CodeText + ': ' + E.Reason);
end;Em thread não há para quem levantar: sem evento, o motivo fica em LastError
da operação. Uma falha de rede (servidor fora do ar) também chega como
ERALSOAPFault, com código Receiver.
| Propriedade | O que faz |
|---|---|
Version |
sv11 (padrão) ou sv12
|
WSDL |
endereço ou arquivo que Importar WSDL lê |
Namespace |
namespace do serviço |
ServicePath |
caminho do serviço abaixo de BaseURL
|
EnvelopeContentType |
troca o Content-Type dos envelopes (padrão: o da versão) |
Operations |
as operações |
OnFault, OnSOAPResponse
|
eventos de todas as operações sem evento próprio |
CompressType |
ctNone no SOAP: servidores SOAP quase nunca leem um pedido comprimido. A resposta comprimida continua aceita |
Cada operação: Name, Namespace, SOAPAction, Style (document ou rpc),
Params, Results, ResultDataSet, OnFault, OnResponse, LastError e
Response.
WSDL 1.1 com binding SOAP 1.1 ou 1.2 (escolhe o da Version do cliente),
document/literal (wrapped) e rpc/literal, tipos inline, xs:import,
xs:include e wsdl:import com schemaLocation/location (é o ?wsdl do
WCF e do JAX-WS), elementos com tipo nomeado, ref e complexContent/extension.
Um valor complexo vira um parâmetro prtXML, cujo Value é o fragmento XML.
SOAP encoded (rpc/encoded) e WSDL 2.0 não são lidos.
uses RALSOAPTypes, RALSOAPClient, RALIndyClient;
Cliente := TRALSOAPClient.Create(nil);
Cliente.EngineType := 'Indy';
Cliente.ImportWSDL('http://localhost:8000/calc?wsdl');
Cliente.Operations['Somar'].Params['a'].Value := '2';
Cliente.Operations['Somar'].Params['b'].Value := '3';
Cliente.Execute('Somar');
Writeln(Cliente.Operations['Somar'].Results.ValueOf('SomarResult'));Começar
Servidor
- Rotas e parâmetros
- Ler o pedido e responder
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- Swagger e Postman
- Servidor SOAP 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
Cliente
Motores
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar