Estou acostumado a escrever código PHP, mas não costumo usar codificação orientada a objetos. Agora preciso interagir com SOAP (como cliente) e não consigo obter a sintaxe correta. Eu tenho um arquivo WSDL que permite configurar corretamente uma nova conexão usando a classe SoapClient. No entanto, não consigo fazer a ligação correta e obter os dados retornados. Preciso enviar os seguintes dados (simplificados):
- ID do contato
- Nome de contato
- Descrição geral
- Montante
Existem duas funções definidas no documento WSDL, mas eu preciso apenas de uma ("FirstFunction" abaixo). Aqui está o script que eu corro para obter informações sobre as funções e tipos disponíveis:
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
E aqui está a saída que ele gera:
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
Digamos que eu queira fazer uma chamada para o FirstFunction com os dados:
- ID do contato: 100
- Nome do contato: John
- Descrição Geral: Barril of Oil
- Quantidade: 500
Qual seria a sintaxe correta? Eu tenho tentado todos os tipos de opções, mas parece que a estrutura do sabão é bastante flexível, então existem muitas maneiras de fazer isso. Também não consegui descobrir isso no manual ...
ATUALIZAÇÃO 1: amostra experimentada do MMK:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
Mas eu recebo esta resposta: Object has no 'Contact' property
. Como você pode ver na saída de getTypes()
, existe um struct
chamado Contact
, então eu acho que, de alguma forma, preciso esclarecer que meus parâmetros incluem os dados de contato, mas a pergunta é: como?
ATUALIZAÇÃO 2: Eu também tentei essas estruturas, mesmo erro.
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
Assim como:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
Erro nos dois casos: o objeto não possui propriedade 'Contato'
Você também pode usar os serviços SOAP dessa maneira:
Este é um exemplo com um serviço real e funciona.
Espero que isto ajude.
fonte
Inicialize primeiro os serviços da web:
Em seguida, defina e passe os parâmetros:
Observe que o nome do método está disponível no WSDL como nome da operação, por exemplo:
fonte
Não sei por que meu serviço da web tem a mesma estrutura que você, mas não precisa de Class para parâmetro, apenas é array.
Por exemplo: - Meu WSDL:
Eu var_dump:
Aqui está o resultado:
Então, no meu código:
mas com sucesso!
fonte
Leia isso;-
http://php.net/manual/en/soapclient.call.php
Ou
Este é um bom exemplo para a função SOAP "__call". No entanto, está obsoleto.
fonte
Primeiro, use o SoapUI para criar seu projeto de sabão a partir do wsdl. Tente enviar uma solicitação para jogar com as operações do wsdl. Observe como a solicitação xml compõe seus campos de dados.
E então, se você está tendo problemas para fazer o SoapClient agir como você deseja, aqui está como eu o depuro. Defina o rastreio da opção para que a função __getLastRequest () esteja disponível para uso.
Em seguida, a variável $ xml contém o xml que o SoapClient compõe para sua solicitação. Compare este xml com o gerado no SoapUI.
Para mim, o SoapClient parece ignorar as chaves da matriz associativa $ params e interpretá-la como matriz indexada, causando dados de parâmetros incorretos no xml. Ou seja, se eu reordenar os dados em $ params , a resposta $ será completamente diferente:
fonte
Se você criar o objeto de SoapParam, isso resolverá o seu problema. Crie uma classe e mapeie-a com o tipo de objeto fornecido pelo WebService, Inicialize os valores e envie a solicitação. Veja a amostra abaixo.
fonte
Eu tive o mesmo problema, mas acabei de encerrar os argumentos assim e funciona agora.
Usando esta função:
Você pode ver o XML da solicitação, esteja ele mudando ou não, dependendo dos seus argumentos.
Use [trace = 1, exceções = 0] nas opções do SoapClient.
fonte
Você precisa declarar a classe Contract
ou
Então
ou
fonte
Você precisa de uma matriz multidimensional, pode tentar o seguinte:
em PHP, uma matriz é uma estrutura e é muito flexível. Normalmente, com chamadas de sabão, eu uso um wrapper XML para não ter certeza se ele funcionará.
EDITAR:
O que você pode querer tentar é criar uma consulta json para enviar ou usá-la para criar uma compra xml, seguindo o que está nesta página: http://onwebdev.blogspot.com/2011/08/php-converting-rss- to-json.html
fonte
Existe uma opção para gerar objetos php5 com a classe WsdlInterpreter. Veja mais aqui: https://github.com/gkwelding/WSDLInterpreter
por exemplo:
fonte
getLastRequest ():
Este método funciona apenas se o objeto SoapClient foi criado com a opção de rastreamento configurada como TRUE.
VERDADEIRO, neste caso, é representado por 1
trabalhou para mim.
fonte