История одной интеграции с API Яндекс.Карт

Мы трепетно относимся к релизам и довольно тщательно все тестируем перед деплоем в production. Поэтому любую ошибку мы анализируем очень серьезно. Естественно, ни один проект ни одной компании не застрахован от ошибок. Но, к сожалению, есть вещи, на которые повлиять ни клиенты, ни разработчики просто не в состоянии.

На личном опыте убедились, что даже такой технологический гигант, как Яндекс способен пропустить в production ошибку, которая заставит подпрыгнуть не одного программиста (спойлер: всё закончилось хорошо!)

Один из наших проектов активно работает с API Яндекс.Карт. Намедни (пусть будет среда) мы готовим очередной релиз, предварительно все протестировав. Но в четверг часть функционала просто отказывается работать! CRM клиента парализована, работа встала. Детальное изучение истории изменений за последний релиз, два, три... ни к чему не привели. Сказать, что мы были «взволнованы» — ничего не сказать.

Всё говорило о том, что проблема не на нашей стороне... ЯНДЕКС? Да ладно? Не может быть! И интернет молчит — нет ни вопросов, ни статей по теме проблемы. Но обо всем по порядку.

Те, кто работал с Яндекс.Картами знают, что интеграция начинается с подключения скрипта. Так вот, запрос в геокодер по координатам:

ymaps.geocode([55.753994, 37.622093], {kind: ‘district’});

завершается ошибкой, которая гласит:

{
  «statusCode»:400,
  «error»:«Bad Request»,
  «message»:«Error validating query: \«spn\" is not allowed to be empty»
}

Перечитав повторно документацию находим примечание:

Если в параметре geocode указаны координаты и параметр kind имеет значение district, параметр spn не учитывается.

Похоже на наш случай! Наши программисты делают заключение, что версия JS обновилась (ведь раньше всё работало, и не один месяц). Поэтому принимается решение вместо актуальной 2.1.74 подключить 2.1.73 и даже 2.1.16, но результат прежний...

{
  «statusCode»:400,
  «error»:«Bad Request»,
  «message»:«Error validating query: \«spn\" is not allowed to be empty»
}
 

Попытка запустить код в песочнице Яндекс.Карт приводит все к той же ошибке.

Ну раз дело не в JS, значит проблема заключается в серверной реализации геокодера Яндекс.Карт! Такое заключение делает команда разработчиков и за подтверждением отправляется в терминал для выполнения запросов через CURL.

curl 'https://api-maps.yandex.ru/services/search/v2/?callback=id_156656291162553076377&text=55.753994%2C37.622093&format=json&rspn=0&lang=ru_RU&results=20&token=eed46719cd611fea8cd94bfeb9b4f3f7&type=geo&properties=addressdetails&geocoder_sco=latlong&geocoder_kind=district&origin=jsapi2Geocoder&apikey=60445215-6d3a-4f88-87fe-8d52b72e5bc9&spn=' \
 -H 'Referer: https://tech.yandex.ru/maps/jsbox/2.1/reverse_geocode' \ 
 -H 'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ 
 76.0.3809.100 Safari/537.36'
 

Как и ожидалось, ошибка прежняя — spn не может быть пустой.

Зато если убрать &spn= из запроса или наоборот выставить любое значение, то в ответ уже приходят ожидаемые значения.

Таким образом, единственный вариант запустить проект — найти способ, чтобы подсунуть (либо исключить) spn в адрес, который формируют скрипты Яндекса. Фронтенд разработчики берутся декомпозировать код модуля Яндекс геокодера

Яндекс геокодер

и находят элегантное решение:

ymaps.geocode([55.753994, 37.622093], {kind: ‘district’, boundedBy: [[null,null],[null,null]]});

Клиент счастлив. Мы на коне:-)

PS. На обращение в Службу поддержки Яндекса мы получили ответ:

Здравствуйте!

Мы установили, что данная ситуация была вызвана временными затруднениями на нашей стороне, сейчас они устранены и сервис должен работать корректно. Проверьте, пожалуйста.

Приносим наши искренние извинения за доставленные неудобства. Ещё раз спасибо за обращение!

---

С уважением,
Служба поддержки Яндекса
https://yandex.ru/support/

Так что да, мы «получили опыт», в этот раз пройдя квест со всеми неизвестными. А Яндексу респект за оперативность!