Problem z zapytaniem do API

0

Siemka!

Mam do napisania prosty skrypt, który będzie się integrował z API GUS i stamtąd będzie on pobierał informacje na temat NIP (a bardziej będzie sprawdzał, czy taki NIP jest zapisany w bazie). Jest jednak pewien problem - wywala komunikat w konsoli przeglądarki, który nawet już wcześniej miałem nieprzyjemność widzieć przy okazji obsługi innego API, ale tamten problem ostatecznie rozwiązałem. Tutaj jednak siedzę już kilka godzin i nie mam już pomysłów co z tym fantem zrobić.
Błąd:

Access to XMLHttpRequest at 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-prod.wsdl' from origin has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

Kod JS, który wysyła zapytanie:

function soap() {
			
			const url = 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-prod.wsdl';
			
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', url, true);

            // build SOAP request
            var sr =
            '  <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>klucz</ns:pKluczUzytkownika>'+
				'</ns:Zaloguj>'+
			  '</soap:Body>'+
			'</soap:Envelope>';
				
				
            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) {
                    if (xmlhttp.status == 200) {
                        alert(xmlhttp.responseText);
                        // alert('done. use firebug/console to see network response');
                    }
                }
            }
			
			
            // Send the POST request
           xmlhttp.setRequestHeader('Content-Type', 'application/soap+xml; charset=utf-8');
		   
            xmlhttp.send(sr);
            // send request
            // ...
        }
		soap();

Wcześniej też znalazłem integracje w PHP, która na prawdę spoko działa, ale niestety php w tym przypadku mi się nie przyda. Podrzucam jednak poniżej kod, który znalazłem w necie - mam nadzieję, że autor kodu nie obrazi się, za cytowanie jego kodu, bo zwyczajnie w świecie zgubiłem link do github'a.

<?php


class GusRegonApi{
    //adresy produkcyjne
    protected $loginUrl = 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc/ajaxEndpoint/Zaloguj';
    protected $searchDataUrl = 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc/ajaxEndpoint/daneSzukaj';
    //adresy testowe
    protected $loginTestUrl = 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc/ajaxEndpoint/Zaloguj';
    protected $searchDataTestUrl = 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc/ajaxEndpoint/daneSzukaj';

    //tutaj wpisan klucz do GUS - obecnie testowy
    protected $key = "klucz";
    protected $session = null;

    protected function makeCurl($field,$url){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $field);
        curl_setopt($curl, CURLOPT_ENCODING, 'UTF-8');
        curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json','Content-Length: '.strlen($field), 'sid:'.$this->session]);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36');
        curl_setopt($curl, CURLOPT_HEADER, false);
        $result = curl_exec($curl);
        curl_close($curl);
        if($this->session==null){
            return json_decode($result)->d;
        }else{
            return str_replace('\u000d\u000a','',$result);
        }
    }

    protected function login(){
        $login = json_encode(["pKluczUzytkownika" => $this->key]);
        $result = $this->makeCurl($login,$this->loginTestUrl);
        return $result;
    }

    public function checkNip($nip){

        if($this->session==null){
            $this->session = $this->login();
        }


        $searchData = json_encode([
            'jestWojPowGmnMiej' => true,
            'pParametryWyszukiwania' => [
                'AdsSymbolGminy' => null,
                'AdsSymbolMiejscowosci' => null,
                'AdsSymbolPowiatu' => null,
                'AdsSymbolUlicy' => null,
                'AdsSymbolWojewodztwa' => null,
                'Dzialalnosci' => null,
                'FormaPrawna' => null,
                'Krs' => null,
                'Krsy' => null,
                'NazwaPodmiotu' => null,
                'Nip' => $nip,
                'Nipy' => null,
                'NumerwRejestrzeLubEwidencji' => null,
                'OrganRejestrowy' => null,
                'PrzewazajacePKD' => false,
                'Regon' => null,
                'Regony14zn' => null,
                'Regony9zn' => null,
                'RodzajRejestru' => null,
                ]
            ]
        );

        $result = $this->makeCurl($searchData,$this->searchDataTestUrl);
        return $result;
    }


}

Jakieś pomysły? Dodam oczywiście na starcie, że to nie wina klucza - ukryłem go po prostu :)

2

Odpowiedź masz w komunikacie błędu:
Request header field content-type is not allowed by Access-Control-Allow-Headers

Musisz zrobić sobie jakieś proxy w PHP.

0

@katakrowa: Nie no jasne, zdaje sobie z tego sprawę, że odpowiedź jest w komunikacie, bardziej nie wiedziałem, jak się za to zabrać. :D Idę w takim razie poczytać o tym na necie , w razie czego podpytam tutaj jeszcze w wątku. :D

1
kunegundek napisał(a):

@katakrowa: Nie no jasne, zdaje sobie z tego sprawę, że odpowiedź jest w komunikacie, bardziej nie wiedziałem, jak się za to zabrać. :D Idę w takim razie poczytać o tym na necie , w razie czego podpytam tutaj jeszcze w wątku. :D

Nie ma co czytać - zrób "proxy" w PHP i masz problem rozwiązany.

0

Dzięki wielkie, udało się zrobić to, wszystko śmiga, jestem mega wdzięczny! <3 :D Jakby ktoś kiedyś tu trafił z podobnym problemem, to podpowiem jak to zrobić, jeśli ktoś by nie wiedział, nie trzeba dużych kombinacji - wystarczy stworzyć w php odwołanie do klasy pobierającej dane z API, która po przesłanej zmiennej get będzie pobierać dane z API, a następnie będzie je wywalać za pomocą echa. Potem w ajaxie wystarczy wysłać zapytanie GET do pliku php, gdzie znajduje się wywołanie klasy sprawdzającej nip. Ważne tylko, żeby w zapytaniu ustawić asynchroniczność na false i tyle. :) Jeszcze raz dzięki @katakrowa za pomoc, bardzo dobrze nakierowałeś mnie na to, co należy zrobić, nawet nie pomyślałem o tym, bo ajaxa, to ja rzadko używałem do tej pory, czas jednak chyba się z nim bardziej zaprzyjaźnić, bo nawet do prostych przeróbek na stronie jak widać może sporo pomóc. :)

2
kunegundek napisał(a):

bo ajaxa, to ja rzadko używałem do tej pory, czas jednak chyba się z nim bardziej zaprzyjaźnić

No to chyba już za późno :-) Teraz mamy FetchApi ( https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API )

0

@katakrowa: No i kolejny raz dzięki, haha. :) W wolnej chwili rzucę sobie okiem na dokumentacje i chociaż poduczę się podstaw Fetch_API, bo te powinny na moje aktualne potrzeby wystarczyć, a przyszłościowo pewnie i zgłębię mocniej temat, bo warto, nie straciłbym kilku godzin na kombinacje w czystym js. :D

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