junior
Что такое Jira REST API и как с ним работать?
Jira REST API — основной программный интерфейс для взаимодействия с Jira извне, позволяющий выполнять CRUD-операции над задачами, проектами, пользователями, workflow и другими сущностями.
REST API v2 vs v3
- v2 — стабильный API, доступен и в DC, и в Cloud. Базовый URL:
/rest/api/2/ - v3 — Cloud-only, поддерживает ADF (Atlassian Document Format) для rich-text, улучшенная пагинация. Базовый URL:
/rest/api/3/
Аутентификация
| Метод | DC | Cloud | Описание |
|---|---|---|---|
| Basic Auth | Да | Нет (deprecated) | username:password в Base64 |
| PAT (Personal Access Token) | Да | Нет | Токен, привязанный к пользователю DC |
| API Token | Нет | Да | Токен Atlassian аккаунта + email |
| OAuth 2.0 (3LO) | Нет | Да | Полный OAuth-flow с авторизацией пользователя |
| OAuth 2.0 (2LO) | Нет | Да | App-level доступ без пользователя |
Основные эндпоинты
Пример
GET /rest/api/2/issue/{issueKey} — получить задачу
POST /rest/api/2/issue — создать задачу
PUT /rest/api/2/issue/{issueKey} — обновить задачу
DELETE /rest/api/2/issue/{issueKey} — удалить задачу
POST /rest/api/2/issue/{issueKey}/transitions — сменить статус
POST /rest/api/2/search — поиск через JQL
GET /rest/api/2/project — список проектов
GET /rest/api/2/user?accountId=... — информация о пользователе
Пример: создание задачи (Java, Spring RestClient)
Код JiraIssueService
@Service
public class JiraIssueService {
private final RestClient restClient;
public JiraIssueService(@Value("${jira.base-url}") String baseUrl,
@Value("${jira.pat}") String pat) {
this.restClient = RestClient.builder()
.baseUrl(baseUrl + "/rest/api/2")
.defaultHeader("Authorization", "Bearer " + pat)
.defaultHeader("Content-Type", "application/json")
.build();
}
public String createIssue(String projectKey, String summary, String description) {
String body = """
{
"fields": {
"project": {"key": "%s"},
"summary": "%s",
"description": "%s",
"issuetype": {"name": "Task"}
}
}
""".formatted(projectKey, summary, description);
Map<String, Object> response = restClient.post()
.uri("/issue")
.body(body)
.retrieve()
.body(new ParameterizedTypeReference<>() {});
return (String) response.get("key");
}
}
Пример: поиск через JQL
Пример
public List<Map<String, Object>> searchIssues(String jql, int maxResults) {
String body = """
{
"jql": "%s",
"maxResults": %d,
"fields": ["summary", "status", "assignee"]
}
""".formatted(jql, maxResults);
Map<String, Object> response = restClient.post()
.uri("/search")
.body(body)
.retrieve()
.body(new ParameterizedTypeReference<>() {});
return (List<Map<String, Object>>) response.get("issues");
}
Пример: смена статуса (transition)
Пример
public void transitionIssue(String issueKey, String transitionId) {
String body = """
{
"transition": {"id": "%s"}
}
""".formatted(transitionId);
restClient.post()
.uri("/issue/{issueKey}/transitions", issueKey)
.body(body)
.retrieve()
.toBodilessEntity();
}
Пагинация и Rate Limiting
- Параметры
startAtиmaxResults, ответ содержитtotal,startAt,maxResults - Cloud API ограничивает
maxResultsдо 100 для большинства эндпоинтов - HTTP 429 (Too Many Requests) с заголовком
Retry-After, рекомендуется экспоненциальный backoff
Частые ошибки
- Использование Basic Auth с паролем в Cloud — поддерживается только API Token + email
- Игнорирование rate limiting — приложение получает 429 и ломается
- Жёсткое указание
maxResults=1000— в Cloud реальный лимит 100, лишнее игнорируется - Не обработка ошибок 404 при обращении к удалённым или перемещённым задачам
Как используется в 2026
- REST API v3 — стандарт для Cloud-разработки
- Spring 6+ RestClient и WebClient — основные HTTP-клиенты для Java-интеграций
- Atlassian активно развивает GraphQL API (пока в beta), но REST остаётся основным
- Personal Access Tokens (PAT) стали стандартом аутентификации для DC-интеграций
На собеседовании: покажите знание отличий между v2 (DC + Cloud) и v3 (Cloud-only). Обязательно упомяните пагинацию и rate limiting — это реальная повседневная проблема. Частая ошибка кандидатов — не упомянуть различия в аутентификации между DC (PAT) и Cloud (OAuth 2.0).