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 | 1195
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
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)