Gymterview
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).