NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: SOAP komunikace

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
maxy obr
Člen
Avatar
maxy obr:30.8.2016 11:39

Snážím se prvně vytvořit SOAP komunikaci pomocí PHP. Přečetl jsem všechno možné co jsem našel na netu ale pořád tápu. Chápu to správně, že pokud chci využít SOAP komunikaci musím krom toho, že si vytvořím SOAP envelope a xml strukturu před tím ještě volat funkci SoapClient kde dávám odkaz na wsdl soubor?
Dále mě není jasné jak se dostanu k nějaké odpovědi když pošlu požadovaný xml soubor. Nyní to vypadá někak takto nejprve PHPkem volám

header('Content-type: text/xsd; charset=utf-8');   //xml??
header('Pragma: No-cache');
header('Cache-Control: no-cache');
header('Expires: '.GMDate('D, d M Y H:i:s').' GMT');
//header('POST: HTTP 1.1');

$client = new SoapClient("http://www.etrzby.cz/assets/cs/prilohy/EETServiceSOAP.wsdl");

a pak samotný xml

<?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:Header>
  </soap:Header>
  <soap:Body xmlns:xs='http://fs.mfcr.cz/xs/schema/v3'>
   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://fs.mfcr.cz/xs/schema/v3" elementFormDefault="qualified" targetNamespace="http://fs.mfcr.cz/xs/schema/v3" version="3.0">    <xs:Trzba>
     <xs:Hlavicka
      uuid_zpravy='e23e5a5a-08d7-4a08-844d-2b6c6b60621d'
      dat_odesl='2016-12-08T21:19:40 01:00'
      prvni_zaslani='1' overeni='1'
     />
     <xs:Data     dic_popl='CZ00000019' id_provoz='181' id_pokl='00/2535/CN58'     porad_cis='0/2482/IE25' dat_trzby='2016-12-08T21:19:40 01:00' celk_trzba='87988.00'       />     <xs:KontrolniKody>
     <xs:pkp digest='SHA256' cipher='RSA2048' encoding='base64'> EAkJwCGSgO5IlIHHlMZNmREa/effmBMc6wC9KkCGxYvbBoyMWXv579vE4Cv42htqQY33MiEIZHQWvX+t+7u8wAktjtYmAUEAhAgu694xgVVXJpt6FuR/hbGtFxOCTh0lSs2azdMgGQN+RotSY/SDqx+SXd9Sn4s6ob8qUihcJFPEsj8WCYVHd+zeeL9HNSBEbQ4ECJ4i3YW836kP7O8flJPr+vHwqG5401f0DUiYqRnM4RVrC2uw9o/ob5oLsf5OvJWtfvChQijnrHx5lr80yJkXO8oseDvPxmMQA2NKQIYzLL9bZtb4F6M9AxaAExjaZSZB1zulAAfuvMNk3OkmUQ== </xs:pkp>
     <xs:bkp digest='SHA1' encoding='base16'>4b9202c6-d2d36465-9b4989cc-728048c0-4fe46f50</xs:bkp>
     </xs:KontrolniKody>
    </xs:Trzba>
   </xs:schema>
  </soap:Body>
 </soap:Envelope>
Editováno 30.8.2016 11:41
 
Odpovědět
30.8.2016 11:39
Avatar
P(r)D
Člen
Avatar
Odpovídá na maxy obr
P(r)D:30.8.2016 15:56

Měla by existovat nějaká třída, který ukážeš .wsdl, nastavíš parametry a ona sama vytvoří SOAP obálku. Metoda služby ti vrátí objekt OdeslaniTrzby­Response a ten objekt je ta odpověď.. Pomocí prográmku Fiddler (a jiný podobný) můžeš zachitit přímo ten XML co odesíláš a co se ti vrací. V případě EET si dej pozor na co používáš jakej certifikát.. Je jednoduchý se do toho zamotat a pak to samozřejmě nefunguje.. :D

 
Nahoru Odpovědět
30.8.2016 15:56
Avatar
maxy obr
Člen
Avatar
Odpovídá na P(r)D
maxy obr:31.8.2016 9:22

Aha no ta ta třída už má být někde definovaná nebo to musím já sám? Tady je definice XML a tady WSDL
Když používám funkci new SoapClient() použil jsem tam ted WSDL soubor s ukaázkovým WSDL a asi není správně že? :D Jinak ty jsi EET dělal? :) Tam jsou teď certifikáty pouze testovací a jsou k nim přiřazeny údaje tak by t snad mělo být jedno ne? :) Navíc já potřebuju vůbec nějakou odpověď i chybová by byla fajn :D

 
Nahoru Odpovědět
31.8.2016 9:22
Avatar
maxy obr
Člen
Avatar
Odpovídá na P(r)D
maxy obr:31.8.2016 9:45

Pokud použiji

print_r($client->__getFunctions());

vrátí se

Array
(
    [0] => OdpovedType OdeslaniTrzby(TrzbaType $parameters)
)

chápu to tedy správně, že to je ta funkce kterou musím použít pro komunikaci?

 
Nahoru Odpovědět
31.8.2016 9:45
Avatar
maxy obr
Člen
Avatar
Odpovídá na P(r)D
maxy obr:31.8.2016 11:06

Volám tedy $client->OdeslaniTrzby($pa­rametrs) s tím, že $parametrs je nějaké pole. Vypíšu si také strukturu kterou by pole mělo mít print_r($client->__getTypes()); Doufám, že to tak píšu správně :D. Ale moudrej z toho nejsem, struktura vypadá takto

Array
(
    [0] => struct TrzbaType {
 TrzbaHlavickaType Hlavicka;
 TrzbaDataType Data;
 TrzbaKontrolniKodyType KontrolniKody;
}
    [1] => struct TrzbaHlavickaType {
 UUIDType uuid_zpravy;
 dateTime dat_odesl;
 boolean prvni_zaslani;
 boolean overeni;
}
    [2] => struct TrzbaDataType {
 CZDICType dic_popl;
 CZDICType dic_poverujiciho;
 IdProvozType id_provoz;
 string id_pokl;
 string porad_cis;
 dateTime dat_trzby;
 CastkaType celk_trzba;
 CastkaType zakl_nepodl_dph;
 CastkaType zakl_dan1;
 CastkaType dan1;
 CastkaType zakl_dan2;
 CastkaType dan2;
 CastkaType zakl_dan3;
 CastkaType dan3;
 CastkaType cest_sluz;
 CastkaType pouzit_zboz1;
 CastkaType pouzit_zboz2;
 CastkaType pouzit_zboz3;
 CastkaType urceno_cerp_zuct;
 CastkaType cerp_zuct;
 RezimType rezim;
}
    [3] => struct TrzbaKontrolniKodyType {
 PkpElementType pkp;
 BkpElementType bkp;
}
    [4] => struct PkpElementType {
 PkpType _;
 PkpDigestType digest;
 PkpCipherType cipher;
 PkpEncodingType encoding;
}
    [5] => struct BkpElementType {
 BkpType _;
 BkpDigestType digest;
 BkpEncodingType encoding;
}
    [6] => struct OdpovedType {
 OdpovedHlavickaType Hlavicka;
 OdpovedPotvrzeniType Potvrzeni;
 OdpovedChybaType Chyba;
 OdpovedVarovaniType Varovani;
}
    [7] => struct OdpovedHlavickaType {
 UUIDType uuid_zpravy;
 BkpType bkp;
 dateTime dat_prij;
 dateTime dat_odmit;
}
    [8] => struct OdpovedPotvrzeniType {
 FikType fik;
 boolean test;
}
    [9] => struct OdpovedChybaType {
 KodChybaType kod;
 boolean test;
}
    [10] => struct OdpovedVarovaniType {
 KodVarovType kod_varov;
}
    [11] => string string
    [12] => dateTime dateTime
    [13] => decimal CastkaType
    [14] => int IdProvozType
    [15] => int RezimType
    [16] => int KodChybaType
    [17] => int KodVarovType
    [18] => string UUIDType
    [19] => string CZDICType
    [20] => base64Binary PkpType
    [21] => string PkpDigestType
    [22] => string PkpCipherType
    [23] => string PkpEncodingType
    [24] => string BkpType
    [25] => string BkpDigestType
    [26] => string BkpEncodingType
    [27] => string FikType
)

Pokud vložím do pole nějaké údaje (pravděpodobně ve špatném formátu) dostanu chybu

b>Fatal error</b>:  Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'Hlavicka' property in C:\xampp\htdocs\eet.php:80
Stack trace:
#0 C:\xampp\htdocs\eet.php(80): SoapClient-&gt;__call('OdeslaniTrzby', Array)
#1 C:\xampp\htdocs\eet.php(80): SoapClient-&gt;OdeslaniTrzby(Array)
#2 {main}
  thrown in <b>C:\xampp\htdocs\eet.php</b> on line <b>80</b><br />

Z toho tedy chápu, že mám vytvořit objekt s proměnou hlavicka. Vzhledem k tomu, že neprogramuji objektově pokusy o vytvoření zrovna neprošli. Potřeboval bych tedy vědět jak vytvářet ty objekty ve správném formátu. Díky. :-)

 
Nahoru Odpovědět
31.8.2016 11:06
Avatar
P(r)D
Člen
Avatar
Odpovídá na maxy obr
P(r)D:31.8.2016 12:05

já neumim PhP mam tady hotovou implementaci v C#, ale si na správný cestě.. pro komunikaci použiješ funkci OdeslaniTrzby, která má parametr TrzbaType (TrzbaType obsahuje hlavičku, data a kontrolní kódy). Vrátí se ti objekt, kterej obsahuje buď potvrzovací zprávu, nebo chybovou zprávu. Na tom by nic nemělo bejt, já měl problém až se zabezpečenim (WS-Security). musí se správně nastavit client aby mu server odpověděl..

 
Nahoru Odpovědět
31.8.2016 12:05
Avatar
maxy obr
Člen
Avatar
Odpovídá na P(r)D
maxy obr:31.8.2016 12:24

Tak aspoň, že už tomu začínám celkem rozumět. Dáš mi odkaz na tu implementaci v C#, třeba mi to pomůže. Ale pokud jak jsi psal se vytvoří envelope sama a já zasílám jen hlavičku, body a kódy, tak jak se řeší ten podpis v envelope header? Budu to řešit až dořeším toto ale jen mě to hned napadlo.

 
Nahoru Odpovědět
31.8.2016 12:24
Avatar
P(r)D
Člen
Avatar
P(r)D:31.8.2016 13:01

no, tu implementaci v c# ti poskytnout nemůžu, moh bych z toho mít problémy, protože je to majetek firmy, pro kterou sem to dělal.. V C# (když to hodně zjednodušim) je třída, který nastavíš adresu webový služby, spousta parametrů (včetně bezpečnostních parametrů a cest k certifikátum), a objekt, kterej posíláš (=TrzbaType) a SOAP obálka se vygeneruje sama. Ty jí ani nevidíš, teda pokud si neodchytneš síťovej provoz(např programem Fiddler). problém byl v tom nastavit ty parametry a certifikáty tak, aby ta SOAP obálka měla správnej tvar a byla správně podepsaná.. (jinak nedostaneš odpověd) podle toho co sem čet, tak v PHP by to mělo jít podobně..

 
Nahoru Odpovědět
31.8.2016 13:01
Avatar
maxy obr
Člen
Avatar
Odpovídá na P(r)D
maxy obr:31.8.2016 14:45

Jo tak to je jasný, já to pochopil tak, že to máš tady přímo na stránkách. Díky za rady já se tím pokusím nějak probrat. Jen tak pro zajímavost kolik tak hodin si nad tím strávil?

 
Nahoru Odpovědět
31.8.2016 14:45
Avatar
P(r)D
Člen
Avatar
P(r)D:31.8.2016 15:03

no těžko takhle zpětně odhadnout, ale tak 3dny práce mi trvalo, než jsem správně vypočítal PKP a asi tak 5 dní práce získat odpověď.. ale byla to moje první zkušenost s webovejma službama, takže jinej by to zvládnul rychlejc.. :)

 
Nahoru Odpovědět
31.8.2016 15:03
Avatar
maxy obr
Člen
Avatar
Odpovídá na P(r)D
maxy obr:14.9.2016 10:56

Ahoj, tak už jsem se dostal k zabezpečení a musím říct, že netuším jaké parametry do SOAP hlavičky dávat. V dokumentaci EET to není a žádnou dokumentaci pro WS-Security, která by vysvětlovala jak se má implementaci jsem nenašel.

 
Nahoru Odpovědět
14.9.2016 10:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.