Тетушка Жира, скажите пожалуйста…nnВ этой статье мы продолжаем говорить об автоматизации и интеграции Жира с другими системами.nnВ частности не так давно специалистами нашей компании было разработано решение по интеграции некоторого ПО (назовем его «Х») с Atlassian Jira.nnНесколько слов о приложении «Х». Это решение, которое работает на PHP, имеет веб-интерфейс для пользователя и конечно же является чуть ли не центром вселенной для бизнеса небольшой компании. Не правда ли – знакомая ситуация?nnЗадача стояла следующая: отображать в приложении состояние задач по каждому клиенту и при необходимости создавать новую задачу со страницы клиента.nnС первого взгляда все просто: у Jira есть REST API. Обращайся к ней по http и получай ответы. Но на практике есть некоторые тонкости. Например, в нашем случае было решено формировать запросы с помощью JavaScript и AJAX. Запросы, которые требуется посылать серверу Jira, получаются кросс-доменные, потому что ПО «Х» и сервер Jira стоят на разных серверах, не имеющих ничего общего кроме владельца. Также они могут быть особого типа. Из соображений безопасности кросс-доменные запросы нестандартных типов запрещены по умолчанию. Для того, чтобы их разрешить нужно дать команду веб серверу, выставлять правильные значения в заголовках ответа. В Jira такой возможности нет. Проблема известна как Bug и на данный момент она находится на стадии решения.nnВ некоторых подобных случаях помогает использование Type: JSONP вместо JSON при формировании AJAX запроса. Тогда клиент действительно получает ожидаемую строку. Но поскольку этот тип имеет иное предназначение, браузер эту строку пытается трактовать, как JS код. Что вполне правильно. Для того, чтобы понять – почему, нужно обратиться к описанию типа JSONP и функционалу, который в него вложен. Мы уверены, что с этим вы легко справитесь самостоятельно.nnНа одном из форумов поддержки продуктов Atlassian некий специалист дал дельный совет: “Ждите, пока баг поправят или используйте cURL”.nncURL – это свободно распространяемая кроссплатформенная утилита позволяющая обмениваться данными по различным протоколам с синтаксисом URL. По сути программа является оберткой для библиотеки Libcurl. Libcurl имеет модули для интеграции с большим количеством языков программирования (согласно википедии – более 30).nnnnВ нашем случае решение получилось следующим:Клиентское ПО «Х» в JavaScript формирует строку запроса к Jira, тип запроса и набор данных для передачи. Далее с помощью AJAX передает сформированные данные PHP скрипту, который в свою очередь передает эти данные с помощью cURL (в реализации для php) на сервер Jira. Сервер обрабатывает запрос и выдает ответ, который в таком же виде передается клиенту для последующей обработки. Собственно все.nnУже в процессе реализации наткнулись на неожиданное, но логичное поведение. Спецсимволы (“=”,“&”) в строке запроса к Jira (которая при передаче между JavaScript и PHP являлась частью данных) воспринимались, как разделители параметров запроса. Пришлось их маскировать на стороне JavaScript и восстанавливать на стороне PHP.nnНу и в завершение – несколько слов о том, что мы «спрашивали» у Jira, чтобы получить необходимую нам информацию.nnДля того, чтобы получить информацию о задачах определенного клиента мы использовали метод /rest/api/2/search. В параметрах к нему можно указать JQL фильтр, чтобы уменьшить объемы выдаваемых задач.nnДля того, чтобы создать задачу мы использовали несколько методов:метод /rest/api/2/issue/createmeta, чтобы получить список проектов и типов задач в каждом проекте (к слову сказать, среди свойств проектов и свойств типов задач не возможно найти эту связку). Задавая параметры для этого метода можно отфильтровать полученные результаты, а также получить список полей для каждого типа задач. Чтобы получить список – необходимо добавить
expand=projects.issuetypes.fields в параметры URL.
Если Вы чего-то не знаете, Вы всегда можете обратиться к специалистам нашей компании. Мы рады Вам помочь! [email protected]