Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ghlevin

Usando Soapclient com XML puro em PHP

Recommended Posts

Encontrei esse exemplo de envio de XML com o Soapclient. Funciona perfeitamente:
<?php
    $client = new SoapClient('http://www.webservicex.net/ConvertTemperature.asmx?WSDL');


    $function = 'ConvertTemp';


    $arguments= array('ConvertTemp' => array(
                        'Temperature'   => 31,
                        'FromUnit'      => 'degreeCelsius',
                        'ToUnit'        => 'degreeFahrenheit'
                ));


    $options = array('location' => 'http://www.webservicex.net/ConvertTemperature.asmx');


    $result = $client->__soapCall($function, $arguments, $options);


    echo 'Response: ';
    print_r($result);
?>

Só que eu gostaria de usar esses mesmos métodos do Soapclient, mas pra um XML puro como entrada. Nesse caso, acho que ele é:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
    <ConvertTemp xmlns="http://www.webserviceX.NET/">
    <Temperature>31</Temperature>
    <FromUnit>degreeCelsius</FromUnit>
    <ToUnit>degreeFahrenheit</ToUnit>
    </ConvertTemp>
    </soap:Body>
</soap:Envelope>

Alguém sabe como se faz? Estou usando esse exemplo existente como base pra uma aplicação que estou desenvolvendo e que envolve um XML com uma estrutura maior que essa e com maior número de parâmetros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um acréscimo no código pra exibir o XML enviado:

echo "<br><br>REQUEST<br><br>:\n" . htmlentities($client->__getLastRequest()). "\n";

E ele exibiu o que eu esperava, com algumas pequenas diferenças:

<?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.webserviceX.NET/">
        <SOAP-ENV:Body>
            <ns1:ConvertTemp>
                <ns1:Temperature>31</ns1:Temperature>
                <ns1:FromUnit>degreeCelsius</ns1:FromUnit>
                <ns1:ToUnit>degreeFahrenheit</ns1:ToUnit>
            </ns1:ConvertTemp>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

E eu achei também esse código aqui que utiliza o SoapClient tendo o XML puro como entrada:

<?php
$xmlstr = 
'<ns1:ConvertTemp><ns1:Temperature>31</ns1:Temperature><ns1:FromUnit>degreeCelsius</ns1:FromUnit><ns1:ToUnit>degreeFahrenheit</ns1:ToUnit></ns1:ConvertTemp>';

$wsdl = 'http://www.webservicex.net/ConvertTemperature.asmx?WSDL';
$client = new SoapClient($wsdl, array(
    'trace'         => 1,
    'exceptions'    => 0,
));

$xmlVar = new SoapVar($xmlstr, XSD_ANYXML);
$client->ConvertTemp($xmlstr);
print_r($client->ConvertTemp($xmlstr));

echo "<br><br>REQUEST<br><br>:\n" . htmlentities($client->__getLastRequest()). "\n";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites
Encontrei esse código de exemplo de envio de XML para um webservice via SoapClient:
<?php
    $client = new SoapClient('http://www.webservicex.net/ConvertTemperature.asmx?WSDL', array("trace" => 1,"exceptions"=>0));


    $function = 'ConvertTemp';


    $arguments= array('ConvertTemp' => array(
                        'Temperature'   => 31,
                        'FromUnit'      => 'degreeCelsius',
                        'ToUnit'        => 'degreeFahrenheit'
                ));


    $options = array('location' => 'http://www.webservicex.net/ConvertTemperature.asmx');


    $result = $client->__soapCall($function, $arguments, $options);


    echo 'Response: ';
    print_r($result);


    echo "<br><br>REQUEST<br><br>:\n" . htmlentities($client->__getLastRequest()). "\n";
    ?>

E ele me mostra o seguinte XML que foi enviado:

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.webserviceX.NET/">
        <SOAP-ENV:Body>
            <ns1:ConvertTemp>
                <ns1:Temperature>31</ns1:Temperature>   
                <ns1:FromUnit>degreeCelsius</ns1:FromUnit>
                <ns1:ToUnit>degreeFahrenheit</ns1:ToUnit>
            </ns1:ConvertTemp>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Mas agora o que eu queria é fazer uma engenharia reversa com um XML um pouco mais trabalhado. Eis o exemplo (omiti dados por questão de segurança):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:con="http://connectors.omnibees.com/" xmlns="http://www.opentravel.org/OTA/2003/05">
<soapenv:Header>
    <con:OmnibeesCredentials>
        <con:UserCode>USER</con:UserCode>
        <con:UserName>12345</con:UserName>
        <con:UserPassword>user.12345</con:UserPassword>
    </con:OmnibeesCredentials>
</soapenv:Header>
<soapenv:Body>
    <OTA_ProfileCreateRQ Version="3.0" EchoToken="a6738f3f02ed8200588c5290cfb28d8121cc9d66" TimeStamp="2016-10-20T16:04:04+02:00" MessageContentCode="3">
        <POS>
            <Source>
                <RequestorID Type="Hotel" ID="12345"/>
            </Source>
        </POS>
        <UniqueID Type="Customer" ID="1"/>
        <Profile ProfileType="Customer" CreateDateTime="2016-10-20" ShareAllMarketInd="Yes" StatusCode="Active">
            <Customer Language="pt-PT" CurrencyCode="BRL">
                <PersonName>
                    <GivenName>NOME DA PESSOA</GivenName>
                </PersonName>
                <Telephone CountryAccessCode="+55" PhoneNumber="(XX) XXXX-XXXX" PhoneTechType="1" PhoneUseType="5"/>
                <Email EmailType="1">nome@dapessoa.com</Email>
                <Address UseType="Contact">
                    <AddressLine>RUA X, NUMERO X</AddressLine>
                    <CityName>CIDADE</CityName>
                    <PostalCode>12345678</PostalCode>
                    <StateProv StateCode="XX"/>
                    <CountryName Code="BR"/>
                </Address>
            </Customer>
            <UserID PinNumber="demopass" ID="ag.12345"/>
        </Profile>
    </OTA_ProfileCreateRQ>
</soapenv:Body>
</soapenv:Envelope>

Como ele envolve a criação de header e de outros parâmetros, acredito que a variável $arguments seria composta de mais parâmetros.

Alguém sabe como eu posso fazer? Sabem se programas como o SoapUI fazem esse tipo de coisa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a necessidade disso? Pergunto isso para entender mesmo aonde você quer chegar;

A biblioteca Soap facilita a comunicação, por isso você só consegue retornar algumas informações com o trace ativado e não faz uso, de forma direta, do XML.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por daemon
      Boa tarde,
       
      Duvida simples...
       
      Quando recupero os dados RSS, para inserir no banco de dados esta salvando corretamento porém no mysql esta com (ponto) . na frente de todos os registros via RSS.
       
      Fica com um ponto na frente outro atras...
       
      Data/hora:
      .2024-11-30 10:03:47.
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.