GUS Api

1

Piszę prostą apkę która komunikuję się z api GUS i po nipie pobiera dane. Używają SOAP którego nie zbyt ogarniam. Udało mi się wygenerować klienta z pliku wsdl, według ich instrukcji. Następnie robię tak jak podają

UslugaBIRzewnPubl service = new UslugaBIRzewnPubl();
service.setHandlerResolver(new SoapHandlerResolver()); //<- doklejanie SID'a do HTTP HEADER
IUslugaBIRzewnPubl port = service.getE3(new AddressingFeature());
String statusUslugi = "StatusUslugi";
String result = port.getValue(statusUslugi);
// logowanie, jezeli sesja wygasla, badx logowanie pierwszy raz
if ((SoapMessageHandler.sessionCookie.equals("")) || (! result.equals("1"))){
	String sid = port.zaloguj("abcde12345abcde12345");
	SoapMessageHandler.sessionCookie = sid;	
}
// przykład wyszukiwania po NIPie
ObjectFactory objectFactory = new ObjectFactory();
JAXBElement<String> nipParam = objectFactory.createParametryWyszukiwaniaNip("1234567890");
ParametryWyszukiwania parametryWyszukiwania = new ParametryWyszukiwania();
parametryWyszukiwania.setNip(nipParam);
String raport = port.daneSzukaj(parametryWyszukiwania);

raport zwraca mi Stringa w postaci

<root>
  <dane>
    <Regon>jakis regon</Regon>
    <RegonLink><a href='javascript:danePobierzPelnyRaport("00000000000","DaneRaportFizycznaPubl", 1);'>00000000</a></RegonLink>
    <Nazwa>jakas nazwa firmy</Nazwa>
    <Wojewodztwo>jakies wojew</Wojewodztwo>
    <Powiat>jakis powiat</Powiat>
    <Gmina>jakas gmina</Gmina>
    <Miejscowosc>miejscowosc</Miejscowosc>
    <KodPocztowy>kod [pcz</KodPocztowy>
    <Ulica>jakas uli</Ulica>
    <Typ>F</Typ>
    <SilosID>1</SilosID>
  </dane>
</root>

Chciałbym teraz stworzyć obiekt i wyciągnąć do niego tylko np. regon i nazwę.

1

Jeśli udało Ci się wygenerować klienta z wsdla to powinieneś mieć również wygenerowaną klasę reprezentującą obiekt responsa. Ogólnie rzecz biorąc musisz zrobić teraz unmarshalowanie.
Poczytaj np. tutaj na ten temat: https://examples.javacodegeeks.com/core-java/xml/bind/jaxb-unmarshal-example/

0

W jaki sposób wygenerowałeś klienta, że masz klasę SoapHandlerResolver? Chyba, że ją napisałeś? Mam problem, ponieważ mam wygenerowane wszystkie klasy api gus, ale znikąd nie mogę zaciągnąć SoapHandlerResolver oraz SoapMessageHandler.

0

na github masz prosty przykład:

0

na github masz przykład na json: https://github.com/KulaKrzysztof/GUS-API---PHP napisane przez pracownika socware

0

Przykład rozkminy funkcji "zaloguj"
Wyciągnięcie klucza sesji z zwróconego obiektu wygląda tak:
obj['s:Envelope']['s:Body']['ZalogujResponse']['ZalogujResult']['#text'];
Do konwersji XML na JSON użyte to:
https://davidwalsh.name/convert-xml-json

W Javie można by napisać lub użyć podobną klasę konwersji XML do JSON

    let xhr = new XMLHttpRequest();
    const proxy = 'https://cors-anywhere.herokuapp.com/';
    const url = 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc';
    let sr = '<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07"><soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To><wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action></soap:Header><soap:Body><ns:Zaloguj><ns:pKluczUzytkownika>abcde12345abcde12345</ns:pKluczUzytkownika></ns:Zaloguj></soap:Body></soap:Envelope>';

    xhr.open('POST', proxy + url, true);

    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
				let resp=xhr.response;
				resp = resp.substring(resp.indexOf("<s:Envelope"), (resp.indexOf("</s:Envelope>")) + 13);
				let parser = new DOMParser();
				resp = parser.parseFromString(resp,"text/xml");
				let obj=xmlToJson(resp);
				console.log(obj);
            }
        }
    }

    xhr.setRequestHeader('Content-Type', 'application/soap+xml; charset=utf-8');
    xhr.send(sr);```

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