Odeslání požadavku na iBod.cz rubrika: Programování: PHP
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>
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:
Nebo se přihlaste jménem a heslem:
Komentáře