Autor Téma: SOAP server, web service  (Přečteno 634 krát)

Offline SaLIk

  • Mladík
  • **
  • Příspěvků: 71
  • Karma: 1
    • Verze Delphi: 2010, 10 (Seattle)
    • salikovi.cz
SOAP server, web service
« kdy: 03-03-2017, 12:22:58 »
Ahoj všem,
potýkám se s webovou službou a už jsem vyčerpal všechny "google" možnosti a vyzkoušel vše možné i nemožné a proto píšu sem.

Nastíním situaci:
Dostal jsem WSDL soubor s popisem rozhraní WS (webové služby). Ten mi nejprve nešel pomocí WSDLImp.exe z Delphi 10 Seattle naimportovat. Postupně jsem vyzkoušel importéry z D2007 a D2010 až jsem zůstal u importéru z DXE2, u kterého se import zdařil. Zkoušel jsem taky Web Service Toolkit z Lazarusu (asi 3 různé verze), ale ani v jednom případě se import nedokončil a skončil chybou. Vytvořený soubor jsem použil do klienta a podařilo se mi i úspěšně odeslat požadavek na WS a přijmout odpověď.

Protože budu muset vytářet i server, vytvořil jsem nový projekt na SOAP server. K parametrům pro WSDLImp.exe jsem přidal -Os+ -Om+ a vygeneroval si interface a kostru pro implementaci pro server. Pokud ale volám svým vytvořeným klientem mnou vytvořený server, dostávám stále hlášku Unknown SOAPAction "DokumentZalozeni".

Jedním z mnoha tutoriálů, které jsem prošel je např. toto: http://chapmanworld.com/2015/03/30/creating-and-consuming-soap-services-in-delphi/. Je tam i odkaz na DEMO projekt, který když pustím, tak funguje. Při vytváření serveru jsem postupoval podle tohoto tutoriálu. Přeskočil jsem jen vytvoření interface z delphi a použil soubor s interfacem a jeho implementací, co mi vygeneroval WSDLImp.exe. Když jsem porovnával demo a můj server, tak jsem nenašel žádnou odchylku.

Zkusil jsem dokonce z mnou vytvořeného serveru (na localhostu) vyexportovat PAS soubor s definicí interface (http://localhost/wsdl/V_01_01PortSyn) přes WSDLImp.exe, který proběhl v pořádku.

Teď problém:
Proč dostávám při snaze o komunikaci s mnou vytvořeným serverem stále odpověď Unknown SOAPAction "<nazev_akce>"?
Požadavky posílám na adresu http://localhost/soap/V_01_01PortSyn (V_01_01PortSyn je název inteface). Používám stejného klienta, se kterým se vzdálenou WS komunikuji bez problémů a mnou vytvořený server má definovaný stejný interface jako vzdálená WS.

Možná je důležité, že u téměř všech funkcí interface mi to píše následující:
Kód: Delphi [Vybrat]
  1.   V_01_01PortSyn = interface(IInvokable)
  2.   ['{183B6D23-7DA4-CC73-F6CB-08DF93F40FE4}']
  3.  
  4.     // Cannot unwrap:
  5.     //     - Input element wrapper name does not match operation's name
  6.     function  DokumentZalozeni(const body: DokumentZalozeniRequest): DokumentZalozeniResponse; stdcall;
  7.  

Když jsem hledal, co je to za problém, tak to vypadá na nějakou závadu v importéru WSDLImp.exe. Podle jiné diskuze to zase souvisí s
Citace
Wrapper/Non-wrapper
stylem WSDL XML souboru pro WS. Nejčastější východisko pak bylo udělat WS server v C# :) ...

Budu vděčný, za jakoukoliv radu, nápad, postřeh...
Díky

Používám Delphi 10 Seattle
« Poslední změna: 03-03-2017, 12:42:48 od SaLIk »

A380

  • Host
Re:SOAP server, web service
« Odpověď #1 kdy: 04-03-2017, 08:37:05 »
Zdravím, jak vidím dle URL, zdá se, že jde o spisovou službu eSpis od ICZnebo jinou s užitím Best practices), nebo se pletu? :-)

Měl jsem úplně stejný problém, tzn. neúplný import pomocí WSDL importu, zkoušel jsem v DXE i D10.1, ale oproti tomu, co z daných WSDL a XSD vyprodukovalo SOPAUI, tam spousta věcí chybí.

Zkoušel jsem řadu nástrojů z webu (WSDL Flattenery), ale bez výsledku. Nakonec jsem použil osvědčenou cestu s použitím komponent ICS (http://www.overbyte.be) - využívám je léta třeba i pro propojení svých apliakcí s ISZR (Základní registry), ISEP (Registr přestupků) anebo RPSD (Rejstřík podnikatelů v silniční dopravě).

Offline paja666

  • Nováček
  • *
  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: 10.1.2 Berlin
Re:SOAP server, web service
« Odpověď #2 kdy: 05-03-2017, 20:59:39 »
Jestliže je XML request stejný, pak ti asi bude chybět SOAPAction: "xxxx" v headeru. Některé .NET servery to vyžadují. Otestuj si to např. Fiddlerem, kde je rozdíl. Pavel

Offline SaLIk

  • Mladík
  • **
  • Příspěvků: 71
  • Karma: 1
    • Verze Delphi: 2010, 10 (Seattle)
    • salikovi.cz
Re:SOAP server, web service
« Odpověď #3 kdy: 06-03-2017, 10:27:26 »
SOAPAction je v hlavičce obsažený

Kód: Delphi [Vybrat]
  1. POST http://localhost/soap/V_01_01PortSyn HTTP/1.1
  2. SOAPAction: "DokumentZalozeni"
  3. Content-Type: text/xml; charset=utf-8
  4. User-Agent: CodeGear SOAP 1.3
  5. Host: localhost
  6. Content-Length: 1195
  7. Connection: Keep-Alive
  8. Pragma: no-cache

a server (vytvoreny v delphi) vrací

Kód: Delphi [Vybrat]
  1. HTTP/1.1 500 Internal Server Error
  2. Connection: close
  3. Content-Type: text/xml; charset=utf-8
  4. Content-Length: 306
  5. Date: Mon, 06 Mar 2017 09:37:56 GMT
  6.  
  7. <?xml version="1.0" encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" ><SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode><faultstring>Unknown SOAPAction "DokumentZalozeni"</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

Interface s danou SOAP action je přitom v serveru zaregistrovany (viz obrázek).
« Poslední změna: 06-03-2017, 10:47:17 od SaLIk »

Offline SaLIk

  • Mladík
  • **
  • Příspěvků: 71
  • Karma: 1
    • Verze Delphi: 2010, 10 (Seattle)
    • salikovi.cz
Re:SOAP server, web service
« Odpověď #4 kdy: 06-03-2017, 10:58:34 »
Zdravím, jak vidím dle URL, zdá se, že jde o spisovou službu eSpis od ICZnebo jinou s užitím Best practices), nebo se pletu? :-)

Přesně jde o spisovku. ICS jsem si nainstaloval. Řešil jsi s tím i SOAP server? Co si tedy nakonec použil na import WSDL?

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: