Это руководство поможет вам понять модель домена JIRA Service Desk, используя API REST JIRA Service Desk и API REST платформы JIRA для его изучения. Служба JIRA Service Desk построена на платформе JIRA, поэтому также будут обсуждаться объекты ключевого домена платформы JIRA.
Вы должны начать с чтения раздела «Обзор». Каждый раздел после этого охватывает разные объекты в модели домена JIRA Service Desk. Мы рекомендуем вам прочитать все эти разделы сверху вниз, но вы можете прочитать их в другом порядке или пропустить разделы, если хотите.
Если вы хотите просмотреть API REST для JIRA Service Desk или JIRA-платформы, вы можете найти их здесь: JIRA API.
Прежде чем вы начнете
- Вы можете использовать любой клиент REST для работы с примерами этого урока. Примеры были написаны с использованием инструмента завитка. Мы также передали результаты через Python, чтобы облегчить чтение ответов JSON.
- Примеры в этом руководстве были в последний раз протестированы с JIRA Service Desk 3.1.
Обзор
Философия проектирования - конкретные версии общих объектов домена
Объекты домена JIRA Service Desk построены на основе одноранговых платформ JIRA. Например, служебные столы основаны на проектах. Однако объекты JIRA Service Desk имеют гораздо более конкретную цель по сравнению с объектами платформы JIRA. Например, у вас может быть тип запроса «Покупка ноутбука» в JIRA Service Desk, который имеет гораздо более конкретный вариант использования, чем «Тип задачи» Задача (на платформе JIRA), на котором он основан.
Причиной этого является то, что ключевая цель дизайна JIRA Service Desk - иметь простой и целенаправленный опыт для людей, обращающихся за помощью в службу поддержки. Платформа JIRA должна обслуживать множество различных пользовательских опытов, и, как результат, у нее есть общие объекты домена, которые являются более гибкими. Однако эти общие понятия и термины могут не иметь смысла для клиентов службы поддержки. Поэтому JIRA Service Desk сопоставляет общие объекты с конкретными объектами службы JIRA Service Desk. Например, вы можете сопоставить поле задачи «Резюме» (платформа JIRA) с полем типа запроса, которое вы можете назвать «Что вам нужно?». Одно и то же поле имеет двойную цель - оно по-прежнему функционирует как поле «Резюме», но оно представлено как поле «Что вам нужно?».
Если вы понимаете эту философию дизайна, которая лежит в основе того, как платформа JIRA и JIRA Service Desk соотносятся друг с другом, модель домена JIRA Service Desk будет иметь больше смысла.
Резюме объектов домена
РИСУНОК
В этом разделе описываются ключевые объекты домена в JIRA Service Desk, а также соответствующие объекты на платформе JIRA. В приведенной ниже таблице описаны объекты на высоком уровне. Мы рассмотрим каждый объект более подробно, используя API REST, в последующих разделах этой страницы.
Служба поддержки (Служба поддержки JIRA)
- Служебные столы являются «контейнерами» верхнего уровня в JSD и содержат конфигурацию для конкретной службы поддержки. Примером может служить ваша служба технической поддержки.
- Одноранговым объектом для Service Desk является проект. Существует сопоставление 1: 1 между службой поддержки и проектом.
Проект (платформа JIRA)
- Проект представляет собой просто набор задач. В JIRA Service Desk конфигурация, специфичная для платформы JIRA (например, рабочий процесс, разрешения и т. д.), определяется с точки зрения проекта, а не службы поддержки.
- Одноранговым объектом для Проекта является Служба поддержки.
Запрос (Служба поддержки JIRA)
- Запрос (Request) содержит данные, когда клиент запрашивает помощь у команды службы поддержки. Примером может служить запрос клиента на новую учетную запись электронной почты.
- Запрос (Request) состоит из нескольких полей запроса.
- Одноранговым объектом для запроса является задача. Запросы выполняются с точки зрения задач. Запрос(Request) должен быть задачей, хотя задача может быть не Запросом(Request).
Задача (платформа JIRA)
- Задача - это самый маленький контейнер данных на платформе JIRA и может представлять разные вещи (например, ошибку, задачу, запрос(request) и т. д.) В зависимости от того, как организация использует JIRA.
- Задача состоит из нескольких полей задач и имеет «ключ задачи» (полученный из ключа Project), который является уникальным для экземпляра JIRA.
- Одноранговым объектом для задачи является запрос (request) .
Поле запроса (Служба поддержки JIRA)
- Поле запроса - это информация, которую вы хотите записать в запросах(Requests). Поля запроса реализованы с точки зрения полей задач.
- Вы можете рассматривать поля запроса как логическое «представление» по полям задач, которые позволяют переименовать общие поля JIRA на язык, который ваши клиенты поймут. Например, у вас может быть поле запроса «Что вам нужно?», Которое основано на поле задач «Резюме».
- Одноранговым объектом для поля запроса является поле «Задача».
Поле задач (платформа JIRA)
- Поля «Задача» - это «именованные» значения, содержащиеся в «Задачах». Например, резюме задач, дата, статус и т. д.
- Одноранговым объектом для поля «Задача» является поле «Запрос».
Комментарий (платформа JIRA и сервисный центр JIRA)
- Комментарии прилагаются к запросам / задачам и представляют собой разговор, связанный с обслуживанием запросов.
Тип запроса (JIRA Service Desk)
- Тип запроса определяет информацию, которая должна быть захвачена для определенного типа запросов. Вы можете думать о них как о способе категоризации запросов в Service Desk. Например, у вас может быть тип запроса «Системный доступ» или тип запроса «Покупка ноутбука».
- Одноранговым объектом для типа запроса является Тип задачи, однако типы запросов и типы задач не равны 1: 1. Различные типы запросов могут быть определены для одного и того же типа задач. Индивидуальный запрос / задача всегда будет иметь один тип запроса.
Тип задачи (платформа JIRA)
- Тип задачи используется на платформе для отображения конфигурации JIRA, например полей и рабочих процессов, в «Задачи».
- Одноранговым объектом для типа задачи является Тип запроса. Индивидуальный запрос / задача всегда будет иметь один тип задачи.
Статус запроса (Служба поддержки JIRA)
- Статус запроса представляет текущее состояние запроса. Клиенты JIRA Service Desk могут видеть состояние запроса из статуса запроса.
- Статус запроса основан на статусе задачи. Например, у вас может быть статус запроса «Завершенный», который основан на «Решенном» статусе задачи.
- Одноранговым объектом для статуса запроса является статус задачи.
Статус задачи (платформа JIRA)
- Статус задачи представляет состояние задачи внутри ее определенного рабочего процесса JIRA. Не все статусы задач отображаются клиентам JIRA Service Desk - возможно, что есть шаги рабочего процесса, которые видны только команде службы поддержки.
- Одноранговым объектом для статуса задач является статус запроса.
Соглашение об уровне обслуживания запросов (JIRA Service Desk)
- SLA запроса используется для отслеживания показателей того, сколько времени тратится на обслуживание запросов. Таймеры устанавливаются, когда Запросы вводят определенные условия, и цели определены для перемещения этих Запросов в и из условий. Например, у вас может быть определено SLA «Время от первого ответа», так что ваша команда может стремиться вернуться к клиенту в течение 4 часов с момента подачи запроса.
- Отсутствует одноранговый объект для соглашения об уровне обслуживания запросов
Сервисные столы и проекты
Основным контейнером объектов домена JIRA Service Desk является Service Desk и его одноранговый объект - проект платформы JIRA. Между Службой поддержки и Проектом существует индивидуальная связь; и Service Desk реализуется из проекта платформы JIRA. Разрешения для управления пользователями, которые могут получить доступ к службе поддержки, контролируются через одноранговый проект.
Служба поддержки является отправной точкой для всех вещей в JIRA Service Desk. Он содержит большинство других объектов домена, таких как типы запросов, поля типа запроса и т. д. Давайте посмотрим, как выглядит Служба поддержки, путем получения списка сервисных столов в системе через REST API:
Пример запроса A
curl -H "X-ExperimentalApi: true" -u agent:agent -X GET "http://localhost:2990/jira/rest/servicedeskapi/servicedesk?start=0&limit=5" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"next": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk?limit=5&start=5",
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk?start=0&limit=5"
},
"isLastPage": false,
"limit": 5,
"size": 5,
"start": 0,
"values": [
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15"
},
"id": 15,
"projectId": 11041,
"projectName": "All Teams Service Desk"
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/19"
},
"id": 19,
"projectId": 11241,
"projectName": "Foundation Leave"
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/21"
},
"id": 21,
"projectId": 11243,
"projectName": "Human Resources Service Desk"
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/16"
},
"id": 16,
"projectId": 11042,
"projectName": "IT Help"
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/23"
},
"id": 23,
"projectId": 11245,
"projectName": "Lawyer Up - Company Lawyer Requests"
}
]
}
Вот несколько замечаний о службе поддержки:
- У каждой службы поддержки есть Id, JIRA projectId и projectName.
- ProjectId происходит от объекта Project домена платформы JIRA. Вы можете получить дополнительную информацию о проекте через JIRA Platform REST API. Во многих случаях вы можете использовать JIRA Service Desk REST API или JIRA Platform REST API для поиска той же информации - когда использовать какой API зависит от вашего варианта использования и того, что вы хотите знать.
- Раздел * _links * вверху содержит полезные URL-адреса URI, которые указывают другие места в системе, такие как базовый URL платформы JIRA.
- JIRA Service Desk REST API использует перелистование для списков ресурсов. В этом случае мы попросили 5 на странице, начиная с 0; то есть первые пять служебных столов. Ссылка * next * будет использоваться для получения следующего набора элементов в списке.
Из ответа можно видеть, что существует прямая связь между Service Desk и его равноправным проектом. Давайте рассмотрим это дальше, получив информацию о проекте для одной из служебных столов через API REST: «Служба обслуживания всех команд» (projectId = 11041):
Пример запроса B
curl -H "X-ExperimentalApi: true" -u agent:agent -X GET "http://localhost:2990/jira/rest/api/2/project/11041" | python -mjson.tool
Ответ
{
"assigneeType": "UNASSIGNED",
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/projectavatar?size=xsmall&avatarId=10873",
"24x24": "http://localhost:2990/jira/secure/projectavatar?size=small&avatarId=10873",
"32x32": "http://localhost:2990/jira/secure/projectavatar?size=medium&avatarId=10873",
"48x48": "http://localhost:2990/jira/secure/projectavatar?avatarId=10873"
},
"components": [
{
"description": "Issues related to the intranet. Created by JIRA Service Desk.",
"id": "10414",
"isAssigneeTypeValid": false,
"name": "Intranet",
"self": "http://localhost:2990/jira/rest/api/2/component/10414"
},
{
"description": "Issues related to JIRA. Created by JIRA Service Desk.",
"id": "10413",
"isAssigneeTypeValid": false,
"name": "JIRA",
"self": "http://localhost:2990/jira/rest/api/2/component/10413"
},
{
"description": "Issues related to the public website. Created by JIRA Service Desk.",
"id": "10415",
"isAssigneeTypeValid": false,
"name": "Public website",
"self": "http://localhost:2990/jira/rest/api/2/component/10415"
}
],
"description": "",
"expand": "description,lead,url,projectKeys",
"id": "11041",
"issueTypes": [
{
"description": "For general IT problems and questions. Created by JIRA Service Desk.",
"iconUrl": "http://localhost:2990/jira/servicedesk/issue-type-icons?icon=it-help",
"id": "13",
"name": "IT Help",
"self": "http://localhost:2990/jira/rest/api/2/issuetype/13",
"subtask": false
},
{
"description": "Track items that need to be bought. Created by JIRA Service Desk.",
"iconUrl": "http://localhost:2990/jira/servicedesk/issue-type-icons?icon=purchase",
"id": "14",
"name": "Purchase",
"self": "http://localhost:2990/jira/rest/api/2/issuetype/14",
"subtask": false
},
{
"description": "Track system outages or incidents. Created by JIRA Service Desk.",
"iconUrl": "http://localhost:2990/jira/servicedesk/issue-type-icons?icon=fault",
"id": "16",
"name": "Fault",
"self": "http://localhost:2990/jira/rest/api/2/issuetype/16",
"subtask": false
},
{
"description": "For new system accounts or passwords. Created by JIRA Service Desk.",
"iconUrl": "http://localhost:2990/jira/servicedesk/issue-type-icons?icon=access",
"id": "17",
"name": "Access",
"self": "http://localhost:2990/jira/rest/api/2/issuetype/17",
"subtask": false
}
],
"key": "SD",
"lead": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Project Admin of some projects",
"key": "patricia",
"name": "projectad",
"self": "http://localhost:2990/jira/rest/api/2/user?username=projectad"
},
"name": "All Teams Service Desk",
"projectTypeKey": "service_desk",
"roles": {
"Administrators": "http://localhost:2990/jira/rest/api/2/project/11041/role/10002",
"Developers": "http://localhost:2990/jira/rest/api/2/project/11041/role/10001",
"Doco Team": "http://localhost:2990/jira/rest/api/2/project/11041/role/10010",
"Service Desk Collaborators": "http://localhost:2990/jira/rest/api/2/project/11041/role/10210",
"Service Desk Customers": "http://localhost:2990/jira/rest/api/2/project/11041/role/10310",
"Service Desk Team": "http://localhost:2990/jira/rest/api/2/project/11041/role/10111",
"Users": "http://localhost:2990/jira/rest/api/2/project/11041/role/10000"
},
"self": "http://localhost:2990/jira/rest/api/2/project/11041",
"versions": []
}
Как вы можете видеть, есть много дополнительной информации о проекте, которую вы можете получить с помощью REST API платформы JIRA. Сюда входят объекты домена, такие как типы задач, компоненты и т. д. Мы не будем здесь подробно обсуждать это, но если вы хотите узнать больше, ознакомьтесь с документацией REST API на ресурсе проекта.
Запросы и задачи
Когда кто-то запрашивает помощь у службы поддержки, которая называется Запросом. В запросе также имеется равноправный объект: задача. Запросы выполняются с помощью задач, так же как и службы поддержки, реализованные из проектов. Однако не все задачи - это запросы. Это связано с тем, что JIRA может использоваться для других целей, таких как JIRA Software и JIRA Core. Основное правило заключается в том, что все, что создается через портал службы поддержки, считается запросом.
Запросы могут быть рассмотрены с точки зрения лица, сообщившего о них. Мы рассмотрим несколько примеров с точки зрения клиента (названного «Ronald the Customer»). Мы увидим, как они будут использовать REST API JIRA Service Desk для получения информации о запросах, которые они создали.
В первом примере показано, как клиент будет извлекать все запросы, что они создали:
Пример запроса C
curl -H "X-ExperimentalApi: true" -u customer:customer -X GET "http://localhost:2990/jira/rest/servicedeskapi/request" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"self": "http://localhost:2990/jira/rest/servicedeskapi/request"
},
"expand": "customerRequest.participant,customerRequest.status,customerRequest.sla,requestType,serviceDesk",
"isLastPage": true,
"limit": 50,
"size": 3,
"start": 0,
"values": [
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17229"
},
"createdDate": {
"epochMillis": 1446776670000,
"friendly": "06/Nov/15 1:24 PM",
"iso8601": "2015-11-06T13:24:30+1100"
},
"currentStatus": {
"status": "Resolved",
"statusDate": {
"epochMillis": 1446776741021,
"friendly": "06/Nov/15 1:25 PM",
"iso8601": "2015-11-06T13:25:41+1100"
}
},
"expand": "customerRequest.participant,customerRequest.status,customerRequest.sla,requestType,serviceDesk",
"issueId": 17229,
"issueKey": "SD-12",
"issueTypeId": "17",
"projectId": 11041,
"reporter": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"requestFieldValues": [
{
"fieldId": "components",
"label": "Which system?",
"value": [
{
"description": "Issues related to JIRA. Created by JIRA Service Desk.",
"id": "10413",
"name": "JIRA",
"self": "http://localhost:2990/jira/rest/api/2/component/10413"
}
]
},
{
"fieldId": "summary",
"label": "What type of access do you need?",
"value": "root access"
},
{
"fieldId": "description",
"label": "Why do you need this?",
"value": "I want to be able to do stuff on JIRA. Giving me root access seems like a good way to do that."
}
],
"requestTypeId": 63,
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17229",
"serviceDeskId": 15
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17228"
},
"createdDate": {
"epochMillis": 1446769068000,
"friendly": "06/Nov/15 11:17 AM",
"iso8601": "2015-11-06T11:17:48+1100"
},
"currentStatus": {
"status": "Resolved",
"statusDate": {
"epochMillis": 1446776578551,
"friendly": "06/Nov/15 1:22 PM",
"iso8601": "2015-11-06T13:22:58+1100"
}
},
"expand": "customerRequest.participant,customerRequest.status,customerRequest.sla,requestType,serviceDesk",
"issueId": 17228,
"issueKey": "SD-11",
"issueTypeId": "17",
"projectId": 11041,
"reporter": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"requestFieldValues": [
{
"fieldId": "components",
"label": "Which system?",
"value": [
{
"description": "Issues related to the public website. Created by JIRA Service Desk.",
"id": "10415",
"name": "Public website",
"self": "http://localhost:2990/jira/rest/api/2/component/10415"
}
]
},
{
"fieldId": "summary",
"label": "What type of access do you need?",
"value": "I need basic login access"
},
{
"fieldId": "description",
"label": "Why do you need this?",
"value": "I have joined the Marketing Zoom team and I need access to the Content Management system to update our public messaging."
}
],
"requestTypeId": 63,
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17228",
"serviceDeskId": 15
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227"
},
"createdDate": {
"epochMillis": 1446768040000,
"friendly": "06/Nov/15 11:00 AM",
"iso8601": "2015-11-06T11:00:40+1100"
},
"currentStatus": {
"status": "Waiting for Support",
"statusDate": {
"epochMillis": 1446768682499,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
}
},
"expand": "customerRequest.participant,customerRequest.status,customerRequest.sla,requestType,serviceDesk",
"issueId": 17227,
"issueKey": "SD-10",
"issueTypeId": "13",
"projectId": 11041,
"reporter": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"requestFieldValues": [
{
"fieldId": "summary",
"label": "What do you need?",
"value": "I need help with the L8 printer"
},
{
"fieldId": "description",
"label": "Why do you need this?",
"value": "Its not printing at all. I have changed the cartridge and pressed reset but not deal.\n\nI am at a loss as to what to do next"
},
{
"fieldId": "customfield_11440",
"label": "Your Office?"
}
],
"requestTypeId": 62,
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227",
"serviceDeskId": 15
}
]
}
Давайте рассмотрим следующие элементы данных:
"issueId": 17229,
"issueKey": "SD-12",
Записи issueId и issueKey представляют собой идентификатор и ключ задачи платформы JIRA используемой для представления этого запроса. Вы можете использовать API REST платформы JIRA, чтобы узнать еще об этой задаче, как показано ниже:
Пример запроса D
curl -H "X-ExperimentalApi: true" -u agent:agent -X GET "http://localhost:2990/jira/rest/api/2/issue/17227" | python -mjson.tool
Ответ
{
"expand": "renderedFields,names,schema,transitions,operations,editmeta,changelog,versionedRepresentations",
"fields": {
"aggregateprogress": {
"progress": 0,
"total": 0
},
"aggregatetimeestimate": null,
"aggregatetimeoriginalestimate": null,
"aggregatetimespent": null,
"assignee": null,
"attachment": [],
"comment": {
"comments": [
{
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Hi Customer X,\n\nWe have received your request. We are about to head our to the company all hands and will get back to you as soon as we can\n\n\u2013 \u00aagent\u2122",
"created": "2015-11-06T11:02:04.601+1100",
"id": "37860",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227/comment/37860",
"updateAuthor": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"updated": "2015-11-06T11:02:04.601+1100"
},
{
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"body": "Ahh good point. I too will be there so I will maybe see you there.",
"created": "2015-11-06T11:02:41.960+1100",
"id": "37861",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227/comment/37861",
"updateAuthor": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"updated": "2015-11-06T11:02:41.960+1100"
},
{
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Hi Customer X,\n\nOk I went up to Level 8 to check on the printer but the floor is being renovated as part of the new building works. I am guessing your are on another level. Our directory service is down right now so can you please tell me what floor you are and also can you tell me what operating system you are running.\n\n\u2013 \u00aagent\u2122",
"created": "2015-11-06T11:09:34.272+1100",
"id": "37862",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227/comment/37862",
"updateAuthor": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"updated": "2015-11-06T11:09:34.272+1100"
},
{
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"body": "I am on level 7 sorry, in the east wing. How do I find out what operating system I have? Is that the Internet browser I am using? Because I think thats just called Safari.",
"created": "2015-11-06T11:11:22.404+1100",
"id": "37863",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227/comment/37863",
"updateAuthor": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"updated": "2015-11-06T11:11:22.404+1100"
},
{
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "\nNote to team - we need to get the directory service back up and running. We cant find out what floor any one is on without.\n",
"created": "2015-11-06T11:12:27.488+1100",
"id": "37864",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227/comment/37864",
"updateAuthor": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"updated": "2015-11-06T11:12:27.488+1100"
},
{
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Also whats up with all the dust coming down the stair well with the new renovations. If it gets into the server room there will be hell to pay.",
"created": "2015-11-06T11:13:22.477+1100",
"id": "37865",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227/comment/37865",
"updateAuthor": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"updated": "2015-11-06T11:13:22.477+1100"
}
],
"maxResults": 6,
"startAt": 0,
"total": 6
},
"components": [],
"created": "2015-11-06T11:00:40.459+1100",
"creator": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"customfield_10001": null,
"customfield_10010": null,
"customfield_10020": null,
"customfield_10022": null,
"customfield_10040": null,
"customfield_10050": null,
"customfield_10051": null,
"customfield_10071": null,
"customfield_10080": null,
"customfield_10090": null,
"customfield_10100": null,
"customfield_10110": null,
"customfield_10120": null,
"customfield_10144": null,
"customfield_10540": null,
"customfield_10541": "She sells sea shells.",
"customfield_10641": null,
"customfield_10642": null,
"customfield_10740": null,
"customfield_11040": {
"_links": {
"jiraRest": "http://localhost:2990/jira/rest/api/2/issue/17227",
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227"
},
"currentStatus": {
"status": "Waiting for Support",
"statusDate": {
"epochMillis": 1446768682499,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
}
},
"requestType": {
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15/requesttype/62"
},
"description": "Get assistance for general IT problems and questions [example]",
"id": 62,
"name": "Get IT help",
"serviceDeskId": 15
}
},
"customfield_11043": {
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/sla/30"
},
"completedCycles": [],
"id": 30,
"name": "Time to resolution",
"ongoingCycle": {
"breachTime": {
"epochMillis": 1446789600000,
"friendly": "06/Nov/15 5:00 PM",
"iso8601": "2015-11-06T17:00:00+1100"
},
"breached": true,
"elapsedTime": {
"friendly": "136h 18m",
"millis": 490681509
},
"goalDuration": {
"friendly": "4h",
"millis": 14400000
},
"paused": false,
"remainingTime": {
"friendly": "-132h 18m",
"millis": -476281509
},
"startTime": {
"epochMillis": 1446768040477,
"friendly": "06/Nov/15 11:00 AM",
"iso8601": "2015-11-06T11:00:40+1100"
},
"withinCalendarHours": true
}
},
"customfield_11044": {
"errorMessage": "metric not found"
},
"customfield_11045": {
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/sla/43"
},
"completedCycles": [
{
"breached": false,
"elapsedTime": {
"friendly": "0m",
"millis": 0
},
"goalDuration": {
"friendly": "15m",
"millis": 900000
},
"remainingTime": {
"friendly": "15m",
"millis": 900000
},
"startTime": {
"epochMillis": 1446768040477,
"friendly": "06/Nov/15 11:00 AM",
"iso8601": "2015-11-06T11:00:40+1100"
},
"stopTime": {
"epochMillis": 1446768124651,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:04+1100"
}
},
{
"breached": false,
"elapsedTime": {
"friendly": "0m",
"millis": 0
},
"goalDuration": {
"friendly": "15m",
"millis": 900000
},
"remainingTime": {
"friendly": "15m",
"millis": 900000
},
"startTime": {
"epochMillis": 1446768162075,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:42+1100"
},
"stopTime": {
"epochMillis": 1446768574276,
"friendly": "06/Nov/15 11:09 AM",
"iso8601": "2015-11-06T11:09:34+1100"
}
}
],
"id": 43,
"name": "Time waiting for support",
"ongoingCycle": {
"breachTime": {
"epochMillis": 1446776100000,
"friendly": "06/Nov/15 1:15 PM",
"iso8601": "2015-11-06T13:15:00+1100"
},
"breached": true,
"elapsedTime": {
"friendly": "136h 18m",
"millis": 490681521
},
"goalDuration": {
"friendly": "15m",
"millis": 900000
},
"paused": false,
"remainingTime": {
"friendly": "-136h 3m",
"millis": -489781521
},
"startTime": {
"epochMillis": 1446768682500,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
},
"withinCalendarHours": true
}
},
"customfield_11046": null,
"customfield_11047": null,
"customfield_11140": [],
"customfield_11340": null,
"customfield_11341": null,
"customfield_11440": null,
"description": "Its not printing at all. I have changed the cartridge and pressed reset but not deal.\n\nI am at a loss as to what to do next",
"duedate": null,
"environment": null,
"fixVersions": [],
"issuelinks": [],
"issuetype": {
"description": "For general IT problems and questions. Created by JIRA Service Desk.",
"iconUrl": "http://localhost:2990/jira/servicedesk/issue-type-icons?icon=it-help",
"id": "13",
"name": "IT Help",
"self": "http://localhost:2990/jira/rest/api/2/issuetype/13",
"subtask": false
},
"labels": [],
"lastViewed": "2015-11-06T13:24:34.643+1100",
"priority": {
"iconUrl": "http://localhost:2990/jira/images/icons/priorities/major.svg",
"id": "3",
"name": "Major",
"self": "http://localhost:2990/jira/rest/api/2/priority/3"
},
"progress": {
"progress": 0,
"total": 0
},
"project": {
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/projectavatar?size=xsmall&avatarId=10873",
"24x24": "http://localhost:2990/jira/secure/projectavatar?size=small&avatarId=10873",
"32x32": "http://localhost:2990/jira/secure/projectavatar?size=medium&avatarId=10873",
"48x48": "http://localhost:2990/jira/secure/projectavatar?avatarId=10873"
},
"id": "11041",
"key": "SD",
"name": "All Teams Service Desk",
"self": "http://localhost:2990/jira/rest/api/2/project/11041"
},
"reporter": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"resolution": null,
"resolutiondate": null,
"status": {
"description": "This was auto-generated by JIRA Service Desk during workflow import",
"iconUrl": "http://localhost:2990/jira/images/icons/statuses/generic.png",
"id": "10021",
"name": "Waiting for Support",
"self": "http://localhost:2990/jira/rest/api/2/status/10021",
"statusCategory": {
"colorName": "yellow",
"id": 4,
"key": "indeterminate",
"name": "In Progress",
"self": "http://localhost:2990/jira/rest/api/2/statuscategory/4"
}
},
"subtasks": [],
"summary": "I need help with the L8 printer",
"timeestimate": null,
"timeoriginalestimate": null,
"timespent": null,
"timetracking": {},
"updated": "2015-11-06T11:13:22.477+1100",
"versions": [],
"votes": {
"hasVoted": false,
"self": "http://localhost:2990/jira/rest/api/2/issue/SD-10/votes",
"votes": 0
},
"watches": {
"isWatching": true,
"self": "http://localhost:2990/jira/rest/api/2/issue/SD-10/watchers",
"watchCount": 1
},
"worklog": {
"maxResults": 20,
"startAt": 0,
"total": 0,
"worklogs": []
},
"workratio": -1
},
"id": "17227",
"key": "SD-10",
"self": "http://localhost:2990/jira/rest/api/2/issue/17227"
}
Глядя на эти данные, вы можете увидеть поля, записанные по этой задаче. Сравните то, как значения поля JIRA Service Desk (Службы поддержки) отличаются в представлении своим партнерам платформы JIRA, как показано ниже:
Служба поддержки JIRA:
"requestFieldValues": [
{
"fieldId": "summary",
"label": "What do you need?",
"value": "I need help with the L8 printer"
},
{
"fieldId": "description",
"label": "Why do you need this?",
"value": "Its not printing at all. I have
changed the cartridge and pressed
reset.\r\n\r\nI am at a loss as
to what to do next"
}
Платформа JIRA:
"description": "Its not printing at all. I
have changed the cartridge and pressed
reset.\r\n\r\nI am at a loss as to what
to do next",
"summary": "I need help with the L8 printer",
Вы заметите, что мы обратились к запросу в качестве пользовательского «клиента» с помощью REST API JIRA Service Desk, но мы переключились на «агент» пользователя при использовании REST API платформы JIRA. Это связано с тем, как работает лицензирование JIRA Service Desk: клиентам разрешено использовать REST API JIRA Service Desk для бесплатного доступа к их запросам, так же как им разрешено бесплатно пользоваться сайтом службы поддержки JIRA. Однако в обмен на эту нулевую стоимость доллара им не разрешено использовать API JIRA REST (или веб-интерфейс JIRA).
Однако лицензированным агентам службы JIRA Service Desk разрешено использовать оба REST API, поэтому мы переключились на «агент», чтобы получить платформу JIRA для просмотра задачи.
Поля типов запроса и поля типа запроса
Тип запроса определяет, какую информацию вы хотите получить от своих клиентов, когда они обратятся за помощью. Поля типа запроса - это поля, которые вы хотите захватить, и указаны на языке, который лучше понять вашим клиентам.
Если вы хотите создать запрос, то перечисление типов запросов и их полей типа запроса позволит вам сделать это более общим образом.
Пример запроса E
curl -H "X-ExperimentalApi: true" -u customer:customer -X GET "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15/requesttype" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15/requesttype"
},
"isLastPage": true,
"limit": 50,
"size": 2,
"start": 0,
"values": [
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15/requesttype/62"
},
"description": "Get assistance for general IT problems and questions [example]",
"id": 62,
"name": "Get IT help",
"serviceDeskId": 15
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15/requesttype/63"
},
"description": "Request a new account for an internal system [example]",
"id": 63,
"name": "Request a new account",
"serviceDeskId": 15
}
]
}
Это показывает, что для этой службы поддержки существует два типа запросов. Давайте рассмотрим обязательные поля для первой, получившей название «Get IT help»
Пример запроса F
curl -H "X-ExperimentalApi: true" -u customer:customer -X GET "http://localhost:2990/jira/rest/servicedeskapi/servicedesk/15/requesttype/62/field" | python -mjson.tool
Ответ
{
"canAddRequestParticipants": true,
"canRaiseOnBehalfOf": false,
"requestTypeFields": [
{
"description": "e.g. 'new mailing list'",
"fieldId": "summary",
"jiraSchema": {
"system": "summary",
"type": "string"
},
"name": "What do you need?",
"required": true,
"validValues": []
},
{
"description": "",
"fieldId": "description",
"jiraSchema": {
"system": "description",
"type": "string"
},
"name": "Why do you need this?",
"required": true,
"validValues": []
},
{
"description": "The best place to find you if we need to chat in person",
"fieldId": "customfield_11440",
"jiraSchema": {
"custom": "com.atlassian.jira.plugin.system.customfieldtypes:select",
"customId": 11440,
"type": "option"
},
"name": "Your Office?",
"required": false,
"validValues": [
{
"children": [],
"label": "Bradfield",
"value": "10320"
},
{
"children": [],
"label": "North Hampton",
"value": "10321"
},
{
"children": [],
"label": "City",
"value": "10322"
}
]
}
]
}
Здесь у нас есть несколько полей типа запроса. Один из наиболее интересных здесь - «customfield_11440». Вот что нужно отметить в этой области:
- Записи jiraSchema рассказывают вам о поле и о том, как оно работает. В этом случае мы можем видеть, что это «выбранное» пользовательское поле, содержащее фиксированный список офисных мест.
- Записи validValues сообщают вам, что считается допустимым значением для этого поля, а также именем и описаниями этого поля. Само поле не является обязательным полем, а это означает, что если вы создали запрос с использованием этого типа запроса,тогда как вам не нужно будет указывать значение. Однако, если вам это нужно, тогда это должно быть одно из допустимых значений.
Комментарии
Вы можете перечислить комментарии, которые были сделаны по запросу. Комментарии приходят в двух вариантах: комментарии общественности и внутренние комментарии. Если клиент (бесплатный) использует REST API, то они будут видеть только публичные комментарии. Однако, если лицензированный агент службы JIRA Service Desk использует REST API, тогда они смогут видеть все комментарии, как общедоступные, так и внутренние. Сравните следующие два вызова REST API, которые извлекают комментарии для запроса:
Клиент получает все комментарии для запроса:
Пример G-запроса
curl -H "X-ExperimentalApi: true" -u customer:customer -X GET "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment"
},
"isLastPage": true,
"limit": 50,
"size": 4,
"start": 0,
"values": [
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37860"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Hi Customer X,\n\nWe have received your request. We are about to head our to the company all hands and will get back to you as soon as we can\n\n\u2013 \u00aagent\u2122",
"created": {
"epochMillis": 1446768124601,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:04+1100"
},
"id": 37860,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37861"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"body": "Ahh good point. I too will be there so I will maybe see you there.",
"created": {
"epochMillis": 1446768161960,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:41+1100"
},
"id": 37861,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37862"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Hi Customer X,\n\nOk I went up to Level 8 to check on the printer but the floor is being renovated as part of the new building works. I am guessing your are on another level. Our directory service is down right now so can you please tell me what floor you are and also can you tell me what operating system you are running.\n\n\u2013 \u00aagent\u2122",
"created": {
"epochMillis": 1446768574272,
"friendly": "06/Nov/15 11:09 AM",
"iso8601": "2015-11-06T11:09:34+1100"
},
"id": 37862,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37863"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"body": "I am on level 7 sorry, in the east wing. How do I find out what operating system I have? Is that the Internet browser I am using? Because I think thats just called Safari.",
"created": {
"epochMillis": 1446768682404,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
},
"id": 37863,
"public": true
}
]
}
Агент получает все комментарии для запроса:
Пример запроса H
curl -H "X-ExperimentalApi: true" -u agent:agent -X GET "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment"
},
"isLastPage": true,
"limit": 50,
"size": 6,
"start": 0,
"values": [
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37860"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Hi Customer X,\n\nWe have received your request. We are about to head our to the company all hands and will get back to you as soon as we can\n\n\u2013 \u00aagent\u2122",
"created": {
"epochMillis": 1446768124601,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:04+1100"
},
"id": 37860,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37861"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"body": "Ahh good point. I too will be there so I will maybe see you there.",
"created": {
"epochMillis": 1446768161960,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:41+1100"
},
"id": 37861,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37862"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Hi Customer X,\n\nOk I went up to Level 8 to check on the printer but the floor is being renovated as part of the new building works. I am guessing your are on another level. Our directory service is down right now so can you please tell me what floor you are and also can you tell me what operating system you are running.\n\n\u2013 \u00aagent\u2122",
"created": {
"epochMillis": 1446768574272,
"friendly": "06/Nov/15 11:09 AM",
"iso8601": "2015-11-06T11:09:34+1100"
},
"id": 37862,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37863"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10092",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10092",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10092",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10092"
},
"displayName": "Ronald The Customer",
"emailAddress": "customer0@atlassian.com",
"key": "ronald",
"name": "customer",
"self": "http://localhost:2990/jira/rest/api/2/user?username=customer",
"timeZone": "Australia/Sydney"
},
"body": "I am on level 7 sorry, in the east wing. How do I find out what operating system I have? Is that the Internet browser I am using? Because I think thats just called Safari.",
"created": {
"epochMillis": 1446768682404,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
},
"id": 37863,
"public": true
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37864"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "\nNote to team - we need to get the directory service back up and running. We cant find out what floor any one is on without.\n",
"created": {
"epochMillis": 1446768747488,
"friendly": "06/Nov/15 11:12 AM",
"iso8601": "2015-11-06T11:12:27+1100"
},
"id": 37864,
"public": false
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/comment/37865"
},
"author": {
"active": true,
"avatarUrls": {
"16x16": "http://localhost:2990/jira/secure/useravatar?size=xsmall&avatarId=10082",
"24x24": "http://localhost:2990/jira/secure/useravatar?size=small&avatarId=10082",
"32x32": "http://localhost:2990/jira/secure/useravatar?size=medium&avatarId=10082",
"48x48": "http://localhost:2990/jira/secure/useravatar?avatarId=10082"
},
"displayName": "\u00aagent\u2122",
"emailAddress": "agent@example.com",
"key": "waldo",
"name": "agent",
"self": "http://localhost:2990/jira/rest/api/2/user?username=agent",
"timeZone": "Australia/Sydney"
},
"body": "Also whats up with all the dust coming down the stair well with the new renovations. If it gets into the server room there will be hell to pay.",
"created": {
"epochMillis": 1446768802477,
"friendly": "06/Nov/15 11:13 AM",
"iso8601": "2015-11-06T11:13:22+1100"
},
"id": 37865,
"public": false
}
]
}
Статусы запросов
Запрос может несколько раз изменять статус, когда вы пытаетесь помочь клиенту. Каждый раз, когда это происходит, клиент сможет увидеть, в каком состоянии находится запрос. Ниже приведен пример запроса, который был повторно открыт после того, как он считался обработанным:
Пример I Запрос
curl -H "X-ExperimentalApi: true" -u customer:customer -X GET "http://localhost:2990/jira/rest/servicedeskapi/request/17227/status" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/status"
},
"isLastPage": true,
"limit": 50,
"size": 4,
"start": 0,
"values": [
{
"status": "Waiting for Support",
"statusDate": {
"epochMillis": 1446768682499,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
}
},
{
"status": "Waiting for Customer",
"statusDate": {
"epochMillis": 1446768574275,
"friendly": "06/Nov/15 11:09 AM",
"iso8601": "2015-11-06T11:09:34+1100"
}
},
{
"status": "Waiting for Support",
"statusDate": {
"epochMillis": 1446768162074,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:42+1100"
}
},
{
"status": "Waiting for Customer",
"statusDate": {
"epochMillis": 1446768124625,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:04+1100"
}
}
]
}
Обратите внимание, что это публичные статусы, которые может видеть клиент. Возможно иметь внутренние статусы, которые могут помочь сервисной команде управлять своей работой (например, «Обзор»), но не нужно делиться с клиентами.
Чтобы увидеть переходы состояния, которые возможны для этой задачи, вы можете использовать API REST платформы JIRA, как показано ниже:
Пример запроса J
curl -H "X-ExperimentalApi: true" -u agent:agent -X GET "http://localhost:2990/jira/rest/api/2/issue/17227/transitions" | python -mjson.tool
Ответ
{
"expand": "transitions",
"transitions": [
{
"id": "801",
"name": "Resolve this issue",
"to": {
"description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.",
"iconUrl": "http://localhost:2990/jira/images/icons/statuses/resolved.png",
"id": "5",
"name": "Resolved",
"self": "http://localhost:2990/jira/rest/api/2/status/5",
"statusCategory": {
"colorName": "green",
"id": 3,
"key": "done",
"name": "Done",
"self": "http://localhost:2990/jira/rest/api/2/statuscategory/3"
}
}
},
{
"id": "851",
"name": "Respond to customer",
"to": {
"description": "This was auto-generated by JIRA Service Desk during workflow import",
"iconUrl": "http://localhost:2990/jira/images/icons/statuses/generic.png",
"id": "10022",
"name": "Waiting for Customer",
"self": "http://localhost:2990/jira/rest/api/2/status/10022",
"statusCategory": {
"colorName": "yellow",
"id": 4,
"key": "indeterminate",
"name": "In Progress",
"self": "http://localhost:2990/jira/rest/api/2/statuscategory/4"
}
}
}
]
}
Соглашения о Сервисном обслуживании Запроса
Соглашения о Сервисном обслуживании Запроса (SLAs) используются, чтобы отследить, сколько времени проведено, обслуживая запросы клиента. Таймеры установлены, когда Запросы входят в определенные условия. Времена цели могут быть определены как идеальное время, чтобы сделать работу прежде, чем это будут считать нарушением обслуживания. Например, Вы можете стремиться возвращаться клиенту в течение четырех часов, и следовательно можете иметь “Время к первому ответу” определенный SLA.
Информация SLA не отображается клиентам. Она используется, чтобы помочь сервисной команде узнать, что является самой важной задачей, на которую они должны обратить внимание.
Показатели SLA могут запускаться и останавливаться в течение срока службы запроса. Например, у вас может быть определено «Время ожидания поддержки», когда таймеры работают только в то время, когда они находятся в командных группах службы поддержки. Таким образом, SLA может иметь много повторяющихся «циклов» и возможный «текущий цикл». Каждый цикл, возможно, был завершен в течение целевого времени или может быть «нарушен».
Достаточно теории, давайте посмотрим, как это выглядит! Следующий вызов API REST возвращает информацию SLA для конкретного запроса:
Пример запроса K
url -H "X-ExperimentalApi: true" -u agent:agent -X GET "http://localhost:2990/jira/rest/servicedeskapi/request/17227/sla" | python -mjson.tool
Ответ
{
"_links": {
"base": "http://localhost:2990/jira",
"context": "/jira",
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/sla"
},
"isLastPage": true,
"limit": 50,
"size": 2,
"start": 0,
"values": [
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/sla/30"
},
"completedCycles": [],
"id": 30,
"name": "Time to resolution",
"ongoingCycle": {
"breachTime": {
"epochMillis": 1446789600000,
"friendly": "06/Nov/15 5:00 PM",
"iso8601": "2015-11-06T17:00:00+1100"
},
"breached": true,
"elapsedTime": {
"friendly": "136h 18m",
"millis": 490682163
},
"goalDuration": {
"friendly": "4h",
"millis": 14400000
},
"paused": false,
"remainingTime": {
"friendly": "-132h 18m",
"millis": -476282163
},
"startTime": {
"epochMillis": 1446768040477,
"friendly": "06/Nov/15 11:00 AM",
"iso8601": "2015-11-06T11:00:40+1100"
},
"withinCalendarHours": true
}
},
{
"_links": {
"self": "http://localhost:2990/jira/rest/servicedeskapi/request/17227/sla/43"
},
"completedCycles": [
{
"breached": false,
"elapsedTime": {
"friendly": "0m",
"millis": 0
},
"goalDuration": {
"friendly": "15m",
"millis": 900000
},
"remainingTime": {
"friendly": "15m",
"millis": 900000
},
"startTime": {
"epochMillis": 1446768040477,
"friendly": "06/Nov/15 11:00 AM",
"iso8601": "2015-11-06T11:00:40+1100"
},
"stopTime": {
"epochMillis": 1446768124651,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:04+1100"
}
},
{
"breached": false,
"elapsedTime": {
"friendly": "0m",
"millis": 0
},
"goalDuration": {
"friendly": "15m",
"millis": 900000
},
"remainingTime": {
"friendly": "15m",
"millis": 900000
},
"startTime": {
"epochMillis": 1446768162075,
"friendly": "06/Nov/15 11:02 AM",
"iso8601": "2015-11-06T11:02:42+1100"
},
"stopTime": {
"epochMillis": 1446768574276,
"friendly": "06/Nov/15 11:09 AM",
"iso8601": "2015-11-06T11:09:34+1100"
}
}
],
"id": 43,
"name": "Time waiting for support",
"ongoingCycle": {
"breachTime": {
"epochMillis": 1446776100000,
"friendly": "06/Nov/15 1:15 PM",
"iso8601": "2015-11-06T13:15:00+1100"
},
"breached": true,
"elapsedTime": {
"friendly": "136h 18m",
"millis": 490682163
},
"goalDuration": {
"friendly": "15m",
"millis": 900000
},
"paused": false,
"remainingTime": {
"friendly": "-136h 3m",
"millis": -489782163
},
"startTime": {
"epochMillis": 1446768682500,
"friendly": "06/Nov/15 11:11 AM",
"iso8601": "2015-11-06T11:11:22+1100"
},
"withinCalendarHours": true
}
}
]
}
Поздравляем! Вы завершили этот обзор модели домена JIRA Service Desk. Есть шоколад! Теперь вы должны хорошо понять, как работают объекты. Затем ознакомьтесь с документацией API REST API JIRA Service Desk и попробуйте сами ее использовать.
По материалам Atlassian JIRA Server Developer Exploring the JIRA Service Desk domain model via the REST APIs