Chyba Access-Control-Allow-Origin

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
vibko
Člen | 43
+
0
-

Dobrý den, jsem již bezradný, proč tento json dotaz nefunguje. Stále mi to vyhazuje chybu No ‚Access-Control-Allow-Origin‘ header is present on the requested resource. Napadá vás, čím by to mohlo být? Zkoušel jsem hledal na google, ale nic mi nepomohlo..

<script>
$.nette.ajax({

                url: "https://b2c.cpost.cz/services/AfternoonParcelDelivery/getDataAsJson?idAddress="+$('input[name="zip"]').val(),
                dataType: 'json',
                type: 'GET'


            }).done(function (data) {

            });
</script>
Pavel Kravčík
Člen | 1195
+
0
-

Hádám, že to posíláš z jiného serveru a ten má zakázané „Access-Control-Allow-Origin“… Server musí mít povolené „*“ nebo tvojí IP.

Nešel mi takhle požadavek z iframe. Nakonec jsme to řešení opustili.

Editoval Pavel Kravčík (27. 9. 2017 12:50)

jiri.pudil
Nette Blogger | 1029
+
+3
-

Posíláš ajaxový požadavek napříč různými hostiteli, což prohlížeče blokují (pro více info hledej „cross origin resource sharing“). Aby tohle fungovalo, musí cílový server poslat v odpovědi patřičné hlavičky, jimiž řekne prohlížeči, že ti má dovolit dotazovanou stránku načíst. To po České poště nemůžeš chtít :)

Nejjednodušší pro tebe bude ajaxem volat nějaký vlastní signál…

$.nette.ajax({
	url: {link fetchData!},
	data: {
		addressId: $('input[name="zip"]').val()
	}
});

…v jehož obsluze pošleš požadavek na ČP a pak jen předáš zpátky odpověď (v ukázce jsem jako HTTP klienta použil Guzzle):

public function handleFetchData($addressId)
{
	$httpClient = new GuzzleHttp\Client(); // nebo lépe předat si jako službu přes DI :)
	$response = $httpClient->request('GET', 'https://b2c.cpost.cz/services/AfternoonParcelDelivery/getDataAsJson',
 [
		'query' => [
			'idAddress' => $addressId,
		],
		'verify' => FALSE, // ČP používá certifikáty, které nejsou v trust chainu, proto je potřeba vypnout SSL verifikaci, nebo lépe stáhnout si kořenový certifikát PostSignum a místo FALSE předat cestu k němu
	]);

	$json = (string) $response->getBody();
	$this->getHttpResponse()->setContentType('application/json');
	$this->sendResponse(new Nette\Application\Responses\TextResponse($json));
}

Editoval jiri.pudil (27. 9. 2017 12:54)

vibko
Člen | 43
+
0
-

SUPER!!! Děkuji moc za pomoc, díky které jsem to vyřešil!