Миграция на новую версию API

в 6:32, , рубрики: api, http, rest, Блог компании HeadHunter, метки: , ,

Подходит к концу время жизни первой версии нашего API. Для тех, кто еще не перевёл свои приложения на новую версию, мы подготовили руководство по миграции.

Самое, что вероятно бросается в глаза — в новой версии нет XML. Да, мы оставили только JSON, но этим всё не ограничивается.

REST

При проектировании API мы следовали REST-подходу в именовании URL’ов и использовании возможностей HTTP-протокола.

Если кратко, то в ответах нашего API помимо стандартных 200, 302, 403, 404 и 500 статусов можно увидеть: 201, 204, 405, 429, 503 и некоторые другие. Клиент API должен уметь корректно их обрабатывать: не делать бессмысленные повторы при 429 и/или 400 и не падать от получения 503.

При именовании URL'ов мы использовали термины «коллекция» и «элемент коллекции», а непосредственно действия выражаем при помощи HTTP-методов.

Теперь для осуществления поиска по вакансиям вместо обращения к /1/json/vacancy/search/ появился адрес коллекции «Вакансии»: /vacancies.

Сделав GET-запрос по этому адресу, можно получить как полную коллекцию (все вакансии на сайте), так и какой-то срез, указав query-параметры: GET /vacancies?text=голова. Указав параметр `text`, мы применили фильтр к коллекции и тем самым получили результаты поиска по вакансиям.

Полный список параметров доступен в одноименном разделе документации.

Можно получить отдельный элемент коллекции, в данном случае вакансию: GET /vacancies/7760476.

У ресурса-коллекции могут быть также подколлекции, какие-то предустановленные срезы всей коллекции. GET /vacancies/favorited вернет те вакансии, которые добавлены у авторизованного пользователя, в «отобранные».

Чтобы добавить вакансию в «отобранные», необходимо добавить вакансию в соответствующую подколлекцию:

PUT /vacancies/favorited/{vacancy_id}

Чтобы убрать, необходимо удалить ее из этой коллекции.

DELETE /vacancies/favorited/{vacancy_id}

Запросы PUT и DELETE являются идемпотентными: если вы попробуете «отобрать» вакансию, которая уже находится в отобранных, PUT вернёт 204, тем самым ответив: «Вы хотите, чтобы эта вакансия была в отобранных? Без проблем. Она в отобранных». Даже если она уже там была. Также и с удалением.

Чтобы создать вакансию (эта функциональность еще не реализована, но запланирована) необходимо будет сделать запрос POST /vacancies, указав в теле параметры создаваемой вакансии. Главное отличие POST от PUT заключается в том, что первый не идемпотентен, то есть при повторном запросе будет попытка создать еще одну вакансию.

В итоге: корректное и широкое применение HTTP-методов, HTTP-кодов и именование URL’ов в соответствии c понятиями: коллекция, подколлекция и элемент коллекции — в нашем понимание и есть REST.

Пагинация и коллекции

Еще немного про коллекции. Все коллекции, которые поддерживают пагинацию (резюме, вакансии, компании и все их подколлекции) выглядят единообразно и имеют корневой объект вида:

{
  "found": 0,
  "per_page": 20,
  "page": 0,
  "pages": 1,
  "items": []
}

К любому запросу коллекции можно в параметрах указать page=N&per_page=M. Нумерация идёт с нуля, по умолчанию выдаётся первая (нулевая) страница с 20 объектами на странице.

Версионность

Мы убрали версионность, в API теперь нет префикса в адресе: /1/.... Все URL идут от корня: https://api.hh.ru/dictionaries. Со временем данные будут расширяться, всегда обеспечивая обратную совместимость. Исключения из этого правила могут быть только в двух случаях:

  • исправление какого-либо критичного дефекта: в релиз, а может даже и в опубликованную документацию, закрадётся ошибка, исправляя которую нам придется изменить формат данных.
  • закрытие API в связи с изменением бизнес-логики: hh.ru перестанет выдавать базу вакансий, у нас исчезнут отклики на сайте как сервис и прочие невероятные, фантастические случаи, когда мы теоретически не сможем поддерживать формат выдаваемых данных.
Меньше «хардкода»

В том месте, где мы выдаём значение, которое представляет собою сущность, доступную в нашем API, мы предоставляем полную ссылку, чтобы избавить вас от необходимости «хардкодить» в вашем приложении адреса.
К примеру, в поиске вакансий:

{
  "items": [
    {
      "url": "https://api.hh.ru/vacancies/1337"
    }
  ]
}

Получив результаты поиска вам нет необходимости самим конструировать ссылку для получения полной информации о вакансии, вам достаточно взять значение ключа url.

Поиск и просмотр вакансий

Теперь о самих данных. Основное и самое популярное использование нашего API — это поиск и выдача вакансий.
Раньше это было доступно по адресам /1/json/vacancy/search/ и /1/json/vacancy/{vacancy_id} соответственно. Теперь, следуя REST-подходу, мы объединили это в коллекцию /vacancies.

Для поиска вам необходимо сделать GET-запрос к ресурсу, передав необходимые query-параметры. Для получения отдельной вакансии — сделать GET-запрос за отдельным элементом: GET /vacancies/7760476 (https://api.hh.ru/vacancies/7760476.

Также раньше у нас был отдельный адрес для получения вакансий конкретной компании, теперь это доступно через поиск: GET /vacancies?employer_id=1455 https://api.hh.ru/vacancies?employer_id=1455

Справочники

Для осуществления запроса к поиску, а также для понимания ответов мы выдаём справочники наших сущностей: тип занятости, график работы, валюты, опыт работы. Раньше это было доступно по отдельным адреса:

  • GET /1/json/employment/
  • GET /1/json/schedule/
  • GET /1/json/experience/
  • GET /1/json/currency/

Теперь мы объединили все эти небольшие справочники в один ресурс `/dictionaries` api.hh.ru/dictionaries. (описание в документации: github.com/hhru/api/blob/master/docs/dictionaries.md).

Отдельные справочники, содержащие большое количество значения (специализации, регионы, метро) мы оставили по отдельным адресам:

Специализации были объединены с профессиональными областями (раньше это было два разных адреса: field и specialization).
Регионы были переименованы в /areasapi.hh.ru/areas.

Авторизация и новые сервисы

Но HeadHunter API не ограничивается поиском вакансий и сопутствующими справочниками. В новой версии доступна авторизация, просмотр откликов и многое другое. Это выходит за рамки статьи про миграцию, но описание всех этих методов доступно в нашей документации. Читайте, пробуйте, пишите нам, следите за новостями!

Автор: mikesub

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js