API Яндекс.Погоды - погода на сайт

Аватар пользователя nick80 nick80 29 марта в 11:49

Добрый день, всем.
Подскажите что делаю не так?
Делаю по примеру: 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 задаю?

Комментарии

Аватар пользователя nick80 nick80 29 марта в 12:45
<?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`

Аватар пользователя nick80 nick80 29 марта в 14:10

Не совсем помогло, я естественно просмотрел "Доки" на Яндексе.
Они пишут:

Пример
Запрос:

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

Аватар пользователя OldWarrior OldWarrior 29 марта в 14:26

nick80 wrote: $response = $client->get($url, array('header' => 'X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx'));

Матчасть, а именно 'headerS':

<?php
...
$client->get($url, array('headers' => array('X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx')));
...
?>
Аватар пользователя OldWarrior OldWarrior 29 марта в 14:55

Да похоже я вас ввёл в заблуждение. Правильную реализацию вы уже привели выше в первом комментарии:

<?php
$response 
$client->get($url, array('headers' => array('X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078')));
?>

Должно работать при правильном API Key.

Аватар пользователя nick80 nick80 29 марта в 15:02
<?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

Аватар пользователя OldWarrior OldWarrior 29 марта в 15:04

Попробуйте ещё как-то так:

<?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',
  ]
]);
?>
Аватар пользователя OldWarrior OldWarrior 29 марта в 14:30

PS. Удивительно, что не требуют явного задания заголовка Content-Type, обычно это требуется во всяких REST'ах.