Доступ к IBM Weather API с PHP работает, но с JS он не работает - PullRequest
0 голосов
/ 25 мая 2019

У меня есть доступ к IBM Weather API в моем приложении.

Когда я пытаюсь получить доступ с помощью PHP:

$auth = base64_encode("<username>:<password>");
$context = stream_context_create([
"http" => [
    "header" => "Authorization: Basic $auth"
]]);
$homepage = file_get_contents("https://twcservice.eu-gb.mybluemix.net/api/weather/v1/geocode/49.14/15.00/forecast/daily/3day.json?language=en-US&units=m", false, $context );
echo($homepage);

Работает.

Но когда я пытаюсь получить доступ с помощью Javascript:

let headers = new Headers();
headers.append("Content-Type", "application/json");
headers.append("Authorization", "Basic " + btoa("<username>" + ":" + "<password>"));
fetch("https://twcservice.eu-gb.mybluemix.net/api/weather/v1/geocode/"+lat.toFixed(2)+"/"+lng.toFixed(2)+"/forecast/daily/3day.json?language=en-US&units=m", {headers: headers})
.then(function(response) {
    console.log(response);
    return response.json();
})
.then(function(json) {
    for(let i = 0; i <= 3; i++) {
        console.log(json['forecasts'][i]['dow']+" - "+json['forecasts'][i]['narrative']);
    }
});

Это дает мне сообщение об ошибке CORS.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://twcservice.eu-gb.mybluemix.net/api/weather/v1/geocode/49.14/15.00/forecast/daily/3day.json?language=en-US&units=m. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘https://*.ibm.com, https://*.ibmcloud.com’).

Я не понимаю, почему.

Спасибо за помощь!

Если IBM Weather API боится кражи своего контента, почему он работает с PHP?

Я не понимаю.

1 Ответ

0 голосов
/ 29 мая 2019

@ Джон Доу

Это проблема CORS. Серверы могут быть настроены так, чтобы браузеры не могли отправлять запросы из разных доменов. Документ Mozilla о CORS отлично подходит для чтения, если вы не знакомы с этой темой.

Обратите внимание, что вы будете сталкиваться с ошибками CORS, только если вы делаете что-то через браузер. Поэтому попытка повторить тот же вызов API в терминале с curl часто будет работать. Делая вещи еще более запутанными!

Был ли ваш PHP-скрипт запущен локально, через терминал?

Если вы возитесь, есть прокси-сервисы, которые обходят CORS, например CORS -where . Попробуйте нажать https://cors-anywhere.herokuapp.com/https://twcservice.eu-gb.mybluemix.net вместо того API, который у вас есть. Обратите внимание, что это не предназначено для чего-либо достойного производства. Просто пытаюсь помочь тебе продвинуться дальше.

...