Odeslání požadavku na iBod.cz rubrika: Programování: PHP

4 Blizard
položil/-a 3.11.2014

Dobrý den,

snažím se vytvořit jednolivé požadavky na službu iBod přes SOAP klienta, ale stále se mi nedaří.

Psal jsem na podporu a řekli mi že mám pravděpodobně špatně hlavičku. Přikládám i ukázkový xml který mi poslali:

<!--request date="2014-10-31T04:56:18" ip="89.250.242.34" -->
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="https://gate.ibod.cz/v2/api.svc">
  <soapenv:Header>
    <To soapenv:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://igate1_test/v2/Api.svc</To>
    <Action soapenv:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://gate.ibod.cz/v2/api.svc/IApi/BalanceGet</Action>
  </soapenv:Header>
  <soapenv:Body>
      <api:BalanceGetRequest>
         <api:Card>xxx</api:Card>
         <api:PartnerId>xxx</api:PartnerId>
      </api:BalanceGetRequest>
   </soapenv:Body>
</soapenv:Envelope

Mnou vygenerované XML:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://gate.ibod.cz/v2/api.svc" xmlns:ns2="http://schemas.microsoft.com/ws/2005/05/addressing/none">
   <SOAP-ENV:Header>
      <ns2:To SOAP-ENV:mustUnderstand="1">https://test.gate.ibod.cz/v2/api.svc</ns2:To>
      <ns2:Action SOAP-ENV:mustUnderstand="1">https://test.gate.ibod.cz/v2/api.svc/IApi/BalanceGet</ns2:Action>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
      <ns1:BalanceGetRequest>
         <ns1:Card>xxx</ns1:Card>
         <ns1:PartnerId>xxx</ns1:PartnerId>
      </ns1:BalanceGetRequest>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Zdrojový kod pro generování

    $this->client = new SoapClient($this->wsdl, array(
    "soap_version" => SOAP_1_1,
    "trace" => true,
    "uri" => $this->server,
    "exceptions" => true,
    "proxy_port" => 443
        )
    );
    $params = array(
    "PartnerId" => self::PARTNER_ID,
    "Card" => $customerID
    );
 
    $headers = array();
    $headers[] = new SoapHeader('http://schemas.microsoft.com/ws/2005/05/addressing/none', 'To', $this->server, true);
    $headers[] = new SoapHeader('http://schemas.microsoft.com/ws/2005/05/addressing/none', 'Action', 'https://test.gate.ibod.cz/v2/api.svc/IApi/BalanceGet', true);
    $this->client->__setSoapHeaders($headers);
 
    $response = $this->client->__soapCall("BalanceGet", array("BalanceGetRequest" => $params));

Přikládám i dokumentaci:
http://spurnyales.eu/download/IBOD-API-v2.2.pdf

UPDATE (odpověď z podpory):
Dobrý den,

po stránce struktur je Vaše volání v pořádku, pokud jej použiji např. v SoapUI tak bez problémů projde.

Problém je hlouběji v protokolu komunikace, kde v hlavičce níže uvedené neodpovídá uvedená hodnota "Content-Length" reálné délce zaslané zprávy.
Ve Vaší správě je uvedena délka 435 bytů ale v reálu byla zpráva dlouhá 445 bytů.

Nedoplňujete do frameworkem vygenerované zprávy před odeslání navíc "ručně" nějaké informace? Reálně dojde k oříznutí requestu podle uvedeného parametru a volání je následně nevalidní.

<HttpRequest>
            <Method>POST
            </Method>
            <QueryString>
            </QueryString>
            <WebHeaders>
              <Connection>Keep-Alive
              </Connection>
              <Content-Length>435</Content-Length>
              <Content-Type>text/xml;charset=UTF-8
              </Content-Type>
              <Accept-Encoding>gzip,deflate
              </Accept-Encoding>
              <Host>test.gate.ibod.cz
              </Host>
              <User-Agent>Apache-HttpClient/4.1.1 (java 1.5)
              </User-Agent>
              <SOAPAction>"https://gate.ibod.cz/v2/api.svc/IApi/BalanceGet"
              </SOAPAction>
            </WebHeaders>
          </HttpRequest>

Komentáře

  • Taco : Problém spočíval v neplatné délce dotazu uloženém v Content-Length viz odpověď podpory. 5.11.2014
odkaz Vyřešeno
4 Blizard
odpověděl/-a 6.11.2014

Problém vyřešen. Problém spočíval v hlavičce "To" a "Action". Po odstranění této hlavičky se problém vyřešil. Každopádně si nejsem jistý jestli to byla má chyba, protože tuto hlavičku jsem zkoušel oddělávat několikrát a vždy to nešlo.. Tzn. požadavek se odesílá klasicky pomocí $client->__soapCall("Metoda", array("MetodaRequest", $param));

Komentáře

  • Taco : Je slušností uvést řešení. 5.11.2014
  • Kit : @Taco: Ty ho nevidíš? Podívej se nahoru. 5.11.2014
  • Taco : Už jsem to našel. 5.11.2014

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.