EWUŚ - Wykonanie metody serviceBroker.executeService...

0

Witam, próbuje zaimplementować obsługę systemu EWUŚ. O ile udało mi się jakoś przeprowadzić logowanie, to nie mam już pojęcia jak odpytać servicebrokera o pacjenta. W FlexBuilderze dodałem sobie Data/Service dla Auth oraz ServiceBroker. Utworzył mi wszystkie niezbędne obiekty. Przeprowadziłem logowanie, zdarzenie auth_resultHandler zwraca mi obiekt ResultEvent, w którym między innymi znajduje się pole result o wartości: ""[000] Użytkownik został prawidłowo zalogowany.". Następnie chce odpytać ServiceBroker o pacjenta:

            protected function button2_clickHandler(event:MouseEvent):void
            {
                executeServiceResult.token = serviceBroker.executeService(authToken, session);
            }

no i tu się rodzą dwa pytania:

  1. Gdzie znajdę authToken:AuthToken oraz session:SessionauthToken
  2. Argumenty metody executeService nie mają nic wspólnego z resztą zapytania (chociażby o pesel pacjenta). Która metoda do tego służy?

Nie mówię, aby od razu podawać gotowe rozwiązanie (chociaż nie pogniewałbym się), ale chociaż podać co i gdzie muszę zrobić. Jaką metodę(y) wywołać, jakie obiekty powołać do życia. Będę bardzo wdzięczny za pomoc, sprawa bardzo nagląca.

3

authToken:AuthToken oraz session:SessionauthToken dostajesz w xml-u, jako odpowiedź na pomyślne logowanie. Całe api jest opisane na stronach nfz-u w pdf-ach, są tam też przykładowe "dokumenty" które krążą pomiędzy klientem a serwerem. Nie wiem jak to będzie wyglądać w actionscript (trochę nie moja działka) - ja to robiłem jako bibliotekę pythona więc niekoniecznie od strony technicznej pomogę, może będę w stanie czasem podpowiedzieć tylko... Ogólnie mówiąc to jest komunikacja typu "ty wysyłasz xml", "odsyłają ci xml-a" - więc oprócz wysyłania musisz go przeczytać ;)

U mnie pobranie token i session to np. coś takiego:

result = self.client.service.login(credentials, self.password)

self.session = self.client.last_received().\
    getChild("soapenv:Envelope").\
    getChild("soapenv:Header").\
    getChild('ns1:session').\
    getAttribute('id').value

self.token = self.client.last_received().\
    getChild("soapenv:Envelope").\
    getChild("soapenv:Header").\
    getChild('ns1:authToken').\
    getAttribute('id').value

Gdzie to last_received() to funkcja zwracająca dokument, który otrzymaliśmy po wywołaniu login(credentials, self.password) - to jest po prostu pobranie z danych z konkretnej gałęzi xml-a. Później to token i session musisz za każdym razem wysłać w nagłówku dokumentu, w którym prosisz o sprawdzenie peselu.

Jeśli chodzi o brak możliwości podania bezpośrednio pesel-a w executeService - nie wywołujesz tego z argumentami typu pesel, wywołujesz to z argumentem w postaci pewnej struktury, gdzie jednym z jej składników jest pesel - w api masz to dość jasno opisane.

0

Na wstępie dziękuję za wyczerpującą odpowiedź i chęć pomocy.
Czytałem tą dokumentację, xmle są dosyć jasne, problem polega na tym, że również nie wiem wiem jak dobrać się do xmla oraz jak go tam zaszyć/wysłać. Sam jestem nowy w actionscripcie.

0
Lasoty napisał(a):

problem polega na tym, że również nie wiem wiem jak dobrać się do xmla oraz jak go tam zaszyć/wysłać. Sam jestem nowy w actionscripcie.

Tu już niestety muszę Ciebie odesłać do dokumentacji actionscript - takie funkcje jakich potrzebujesz na pewno tam są - po prostu trzeba poszukać i zapoznać się z tym jak działają ;)

Natomiast jeśli chodzi o same problemy z ewusiem bardziej od strony co, gdzie jak i dlaczego to chętnie pomogę, o ile będę mógł...

0

Udało mi się odczytać prawidłowo ID sesji oraz token:

 
            protected function loginResult_resultHandler(event:ResultEvent):void
            {
                var xmlIdSesji:XML = event.headers[0];
                var xmlToken:XML = event.headers[1];
                
                txtTest.text = xmlToken.@*.toXMLString();
                
                idSesji = xmlIdSesji.@*.toXMLString();
                token = xmlToken.@*.toXMLString();
                
            }

Niestety nadal nie mam zielonego pojęcia jak umieścić XMLa z danymi do wysłania.

EDIT:

Zmieniłem podejście do problemu, postanowiłem stworzyć własny serwis, który w odpowiedzi zwróci w sposób jawny informacje, które mnie interesują. Serwis tworzę w .net 3.5. Authoryzacja poszła bezbłędnie, mam problem z uzyskaniem statusu CWU. Metody za to odpowiedzialne wyglądają tak:

 
        private void SprawdzStatus(string pesel)
        {
            // przygotowanie pytania
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(GenerujPytanie(pesel));
            XmlElement pytanieXml = doc.DocumentElement;

            // obiekt transmisyjny
            ServiceBroker broker = new ServiceBrokerClient();

            // blok zapytania
            ServiceRequest request = new ServiceRequest()
            {                
                date = DateTime.Now,
                location = new WSServiceBroker.ServiceLocation()
                {
                    @namespace = "nfz.gov.pl/ws/broker/cwu",
                    localname = "checkCWU",
                    version = "3.0",
                },
                payload = new Payload()  //Ładunek z pytaniem
                {
                    textload = pytanieXml
                }
            };

            WSServiceBroker.session sesja = new WSServiceBroker.session();
            sesja.id = loginResp.session.id;

            WSServiceBroker.authToken token = new WSServiceBroker.authToken();
            token.id = loginResp.authToken.id;

            executeServiceRequest esReq = new executeServiceRequest(sesja, token, request);
            
            
            executeServiceResponse response;   // odpowiedź z webserwisu
            try
            {
                response = broker.executeService(esReq);
            }
            catch (SoapException ex)
            {
                EwusException wyjatek = EwusException.Wyodrebnij(ex);
                throw wyjatek;
            }
            //z response wyciągamy dane
            //return response.payload.textload.OuterXml;
            odp.StatusXml = response.executeServiceReturn.payload.textload.InnerXml;

        }

        private string GenerujPytanie(string pesel)
        {
            // paczka z pytaniem CWU  
            status_cwu_pyt pytanie = new status_cwu_pyt();
            pytanie.system_swiad = new system()
            {
                nazwa = "System",
                wersja = "1.0"
            };
            pytanie.numer_pesel = pesel;

            return SerializujDane(pytanie);
        }


Klasa status_cwu_pyt wygląda tak:

    [System.SerializableAttribute()]
    public partial class status_cwu_pyt
    {

        private string numer_peselField;

        private system system_swiadField;

        /// <uwagi/>
        public string numer_pesel
        {
            get
            {
                return this.numer_peselField;
            }
            set
            {
                this.numer_peselField = value;
            }
        }

        /// <uwagi/>
        public system system_swiad
        {
            get
            {
                return this.system_swiadField;
            }
            set
            {
                this.system_swiadField = value;
            }
        }
    }

    /// <uwagi/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2")]
    public partial class system
    {

        private string nazwaField;

        private string wersjaField;

        /// <uwagi/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string nazwa
        {
            get
            {
                return this.nazwaField;
            }
            set
            {
                this.nazwaField = value;
            }
        }

        /// <uwagi/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string wersja
        {
            get
            {
                return this.wersjaField;
            }
            set
            {
                this.wersjaField = value;
            }
        }
    }
 

i niestety dostaję dziwną zwrotkę, z którą nie wiem jak sobie poradzić:

 
System.ServiceModel.FaultException`1[[EwusWS.WSServiceBroker.ServiceException, EwusWS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]: org.apache.axis2.databinding.ADBException: Unexpected subelement numer_pesel

Server stack trace: 
   w System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   w System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   w System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   w System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   w System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   w System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   w System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   w EwusWS.WSServiceBroker.ServiceBroker.executeService(executeServiceRequest request)
   w EwusWS.WSServiceBroker.ServiceBrokerClient.EwusWS.WSServiceBroker.ServiceBroker.executeService(executeServiceRequest request) w c:\users\leszek\documents\visual studio 2010\Projects\EwusWS\Service References\WSServiceBroker\Reference.cs:wiersz 695
   w EwusWS.EWUS.SprawdzStatus(String pesel) w C:\Users\Leszek\Documents\Visual Studio 2010\Projects\EwusWS\EwusWS.asmx.cs:wiersz 161
   w EwusWS.EWUS.SprawdzPacjenta(String login, String pass, String pesel) w C:\Users\Leszek\Documents\Visual Studio 2010\Projects\EwusWS\EwusWS.asmx.cs:wiersz 32

dodam, że w trakcie debugowania payload wygląda tak:

<numer_pesel>***********</numer_pesel>
<system_swiad nazwa="System" wersja="1.0" />
0

@Lasoty, znowu język od którego trzymam sie z daleka ;) Przenoszę do działu C# i .NET, może ktoś się podłączy do tematu...

Lasoty napisał(a):

dodam, że w trakcie debugowania payload wygląda tak:

<numer_pesel>***********</numer_pesel>
<system_swiad nazwa="System" wersja="1.0" />

Oczywiście nie mam się zamiaru wczytywać w kod, ale... Taki pobieżny rzut okiem na dokument wysyłany z zapytaniem o pesel pokazuje nam coś takiego:

<payload>   
   <textload>
      <status_cwu_pyt>
         <numer_pesel>***********</numer_pesel>
         <system_swiad nazwa="***" wersja="***"></system_swiad>
      </status_cwu_pyt>
   </textload>
</payload>

Widzisz jaka powinna być struktura payload? Nic dziwnego, że masz komunikat Unexpected subelement numer_pesel.
W gałęzi payload takiego czegoś nie powinno być! On to ma znaleźć w gałęzi payload->textload->status_cwu_pyt->numer_pesel, a zamiast tego wychodzi mu, że ma jakąś tam gałąź payload->numer_pesel i stwierdza, że tam tego być nie powinno...

Nie wiem, gdzieś masz tę strukturę źle budowaną - tu nie wnikam w kod - warto cały czas zaglądać do dokumentacji i api ewusia i to sobie na bieżąco korygować i sprawdzać - nie znam ani obsługi tej biblioteki ani jej możliwości, więc tu nawet nie będę sprawdzał.

0

Hej Lasoty, Znalazłeś rozwiązanie twojego problemu. Utknąłem na tym samym.

Lasoty napisał(a):

Udało mi się odczytać prawidłowo ID sesji oraz token:

 
            protected function loginResult_resultHandler(event:ResultEvent):void
            {
                var xmlIdSesji:XML = event.headers[0];
                var xmlToken:XML = event.headers[1];
                
                txtTest.text = xmlToken.@*.toXMLString();
                
                idSesji = xmlIdSesji.@*.toXMLString();
                token = xmlToken.@*.toXMLString();
                
            }

Niestety nadal nie mam zielonego pojęcia jak umieścić XMLa z danymi do wysłania.

EDIT:

Zmieniłem podejście do problemu, postanowiłem stworzyć własny serwis, który w odpowiedzi zwróci w sposób jawny informacje, które mnie interesują. Serwis tworzę w .net 3.5. Authoryzacja poszła bezbłędnie, mam problem z uzyskaniem statusu CWU. Metody za to odpowiedzialne wyglądają tak:

 
        private void SprawdzStatus(string pesel)
        {
            // przygotowanie pytania
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(GenerujPytanie(pesel));
            XmlElement pytanieXml = doc.DocumentElement;

            // obiekt transmisyjny
            ServiceBroker broker = new ServiceBrokerClient();

            // blok zapytania
            ServiceRequest request = new ServiceRequest()
            {                
                date = DateTime.Now,
                location = new WSServiceBroker.ServiceLocation()
                {
                    @namespace = "nfz.gov.pl/ws/broker/cwu",
                    localname = "checkCWU",
                    version = "3.0",
                },
                payload = new Payload()  //Ładunek z pytaniem
                {
                    textload = pytanieXml
                }
            };

            WSServiceBroker.session sesja = new WSServiceBroker.session();
            sesja.id = loginResp.session.id;

            WSServiceBroker.authToken token = new WSServiceBroker.authToken();
            token.id = loginResp.authToken.id;

            executeServiceRequest esReq = new executeServiceRequest(sesja, token, request);
        executeServiceResponse response;   // odpowiedź z webserwisu
        try
        {
            response = broker.executeService(esReq);
        }
        catch (SoapException ex)
        {
            EwusException wyjatek = EwusException.Wyodrebnij(ex);
            throw wyjatek;
        }
        //z response wyciągamy dane
        //return response.payload.textload.OuterXml;
        odp.StatusXml = response.executeServiceReturn.payload.textload.InnerXml;

    }

    private string GenerujPytanie(string pesel)
    {
        // paczka z pytaniem CWU  
        status_cwu_pyt pytanie = new status_cwu_pyt();
        pytanie.system_swiad = new system()
        {
            nazwa = "System",
            wersja = "1.0"
        };
        pytanie.numer_pesel = pesel;

        return SerializujDane(pytanie);
    }

Klasa status_cwu_pyt wygląda tak:

```csharp
    [System.SerializableAttribute()]
    public partial class status_cwu_pyt
    {

        private string numer_peselField;

        private system system_swiadField;

        /// <uwagi/>
        public string numer_pesel
        {
            get
            {
                return this.numer_peselField;
            }
            set
            {
                this.numer_peselField = value;
            }
        }

        /// <uwagi/>
        public system system_swiad
        {
            get
            {
                return this.system_swiadField;
            }
            set
            {
                this.system_swiadField = value;
            }
        }
    }

    /// <uwagi/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2")]
    public partial class system
    {

        private string nazwaField;

        private string wersjaField;

        /// <uwagi/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string nazwa
        {
            get
            {
                return this.nazwaField;
            }
            set
            {
                this.nazwaField = value;
            }
        }

        /// <uwagi/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string wersja
        {
            get
            {
                return this.wersjaField;
            }
            set
            {
                this.wersjaField = value;
            }
        }
    }
 

i niestety dostaję dziwną zwrotkę, z którą nie wiem jak sobie poradzić:

 
System.ServiceModel.FaultException`1[[EwusWS.WSServiceBroker.ServiceException, EwusWS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]: org.apache.axis2.databinding.ADBException: Unexpected subelement numer_pesel

Server stack trace: 
   w System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   w System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   w System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   w System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   w System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   w System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   w System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   w EwusWS.WSServiceBroker.ServiceBroker.executeService(executeServiceRequest request)
   w EwusWS.WSServiceBroker.ServiceBrokerClient.EwusWS.WSServiceBroker.ServiceBroker.executeService(executeServiceRequest request) w c:\users\leszek\documents\visual studio 2010\Projects\EwusWS\Service References\WSServiceBroker\Reference.cs:wiersz 695
   w EwusWS.EWUS.SprawdzStatus(String pesel) w C:\Users\Leszek\Documents\Visual Studio 2010\Projects\EwusWS\EwusWS.asmx.cs:wiersz 161
   w EwusWS.EWUS.SprawdzPacjenta(String login, String pass, String pesel) w C:\Users\Leszek\Documents\Visual Studio 2010\Projects\EwusWS\EwusWS.asmx.cs:wiersz 32

dodam, że w trakcie debugowania payload wygląda tak:

<numer_pesel>***********</numer_pesel>
<system_swiad nazwa="System" wersja="1.0" />
0

Nie zajmuję się tematem już długo, ale z tego co widzę błąd wskazuje na to, że obiekt, który próbujesz wysłać posiada pole numer_pesel, które nie jest obsługiwane. Musisz wczytać się w dokumentację, czy to pole nie powinno nazywać się jakoś inaczej.

Pozdrawiam

0

Problem jest w tym, że generowany XML nie zawiera Namespaces, a nr pesel załączał się jako atrybut, a nie odrębny element listy XML

w oryginalnym pliku (wg SOAP UI) jest:

<brok:payload>
  <brok:textload>
     <ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v5">
        <ewus:numer_pesel>XXXXXXXX</ewus:numer_pesel>
        <ewus:system_swiad nazwa="client-eWUŚ" wersja="1.0.0"/>
     </ewus:status_cwu_pyt>
  </brok:textload>
</brok:payload>

zmodyfikowałem te klasy:

private string GenerujPytanie(string pesel)
{
    // paczka z pytaniem CWU  
    status_cwu_pyt pytanie = new status_cwu_pyt();
    pytanie.system_swiad = new system()
    {
        nazwa = "System",
        wersja = "1.0"
    };
    pytanie.numer_pesel = pesel;
    System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(pytanie.GetType());
    System.Xml.Serialization.XmlSerializerNamespaces ns = new System.Xml.Serialization.XmlSerializerNamespaces();
    ns.Add("ewus", "https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v5");
    var sww = new StringWriter();
    XmlWriter writer = XmlWriter.Create(sww);
    x.Serialize(writer, pytanie,ns);
    return sww.ToString();
}
[System.Xml.Serialization.XmlElement(Namespace = "https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v5")]
public string numer_pesel

...

[System.Xml.Serialization.XmlElement(Namespace = "https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v5")]
public system system_swiad

...

oraz:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v5")]
public partial class system

i to w zasadzie rozwiązuje problem i zwraca prawidłową wiadomość

1 użytkowników online, w tym zalogowanych: 0, gości: 1