Chyba Access-Control-Allow-Origin

- vibko
 - Člen | 43
 
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 | 1206
 
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 | 1034
 
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)