Добрый день, всем.
Подскажите что делаю не так?
Делаю по примеру: https://coderbook.ru/2021/09/11/%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%...
<?php $client = \Drupal::httpClient();
$url = "https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393";
$response = $client->get($url, array('header' => 'X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx'));
$body = $response->getBody()->getContents();
$data = json_decode($body , 1); ?>
Сайт пишет нет доступа: GuzzleHttp\Exception\ClientException: Client error: `GET https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393` resulted in a `403 Forbidden` response: Forbidden in GuzzleHttp\Exception\RequestException::create() (line 113 of /var/www/data/www/new/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php).
Подскажите, может я не правильно header задаю?
Комментарии
<?php$url = "https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393";
$response = $client->get($url, array('headers' => array('X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078')));?>
Такая конструкция также дает - > resulted in a `403 Forbidden`
Изучайте:
- https://stackoverflow.com/a/43728849
- https://yandex.ru/dev/weather/doc/dg/concepts/forecast-info.html
- https://yandex.ru/dev/weather/doc/dg/concepts/errors.html
Не совсем помогло, я естественно просмотрел "Доки" на Яндексе.
Они пишут:
Запрос:
GET https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393
X-Yandex-API-Key: 3fc...7
Вопрос в том, как правильно передать X-Yandex-API-Key, указанные выше записи работают не верно.
API не видит X-Yandex-API-Key
Матчасть, а именно 'headerS':
<?php
...
$client->get($url, array('headers' => array('X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx')));
...
?>
Так тоже не работает.
Да похоже я вас ввёл в заблуждение. Правильную реализацию вы уже привели выше в первом комментарии:
<?php
$response = $client->get($url, array('headers' => array('X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078')));
?>
Должно работать при правильном API Key.
<?php
$client = \Drupal::httpClient();
$url = "https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393";
$response = $client->get($url, array('headers' => array('X-Yandex-API-Key' => 'c3014e2d-656e-4389-8ea5-xxxxxxx')));
$body = $response->getBody()->getContents();
$data = json_decode($body , 1);
?>
Большое спасибо, что откликнулись на вопрос.
Привожу рабочую конструкцию запроса API Яндекс.Погоды для Drupal 9. В интернете нет такой информации, теперь будет. Подставляете только свое значение X-Yandex-API-Key
Подскажите как для Drupal 7 это может выглядеть? Вот такой вариант правильный?
<?php
$yandex_weather_url = "https://api.weather.yandex.ru/v2/informers?lat=55.043990&lon=59.964664";
$yandex_weather_options = array(
'method' => 'GET',
'header' => "X-Yandex-API-Key:0000000-0000000-0000000-00000-00000000000000"."\r\n"
);
$response = drupal_http_request($yandex_weather_url, $yandex_weather_options);
$data = json_decode($response);
?>
Разобрался, решение для Drupal 7:
<?php
$yandex_weather_url = "https://api.weather.yandex.ru/v2/forecast?lat=55.043990&lon=59.964664";
$yandex_weather_options = array(
'headers' => array('X-Yandex-API-Key' => '0000000-00000000-0000-0000000000'),
'method' => 'GET'
);
$response = drupal_http_request($yandex_weather_url, $yandex_weather_options);
$data = json_decode($response->data);
$weather=$data->fact;
echo "Температура: ".$weather->temp."°C (ощущается как ".$weather->feels_like."°C)"
?>
Вместо нулей подставляем наш API Key. В переменной $yandex_weather_url в ссылке не забываем указать координаты места (lat и lon)
Попробуйте ещё как-то так:
<?php
$response = $client->get('https://api.weather.yandex.ru/v2/informers', [
'query' => [
'lat' => '55.75396',
'lon' => '37.620393',
],
'headers' => [
'X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078',
]
]);
?>
PS. Удивительно, что не требуют явного задания заголовка
Content-Type
, обычно это требуется во всяких REST'ах.