Полная документация по REST API доступна в разделе "Справочник разработчика"
В справочнике разработчика выберите интересующую сущность и на дополнительной панели справа будет представлен полный перечень атрибутов, с их характеристиками, примеры запросов REST API, пример возвращаемых данных, объектная модель и примеры написания PHP-скриптов для автоматизации.
Для использования REST API в каждом запросе необходимо передавать HTTP-заголовок с ключом:
'Devprom-Auth-Key': 'a806f6e2af139ea856db981c20278865'
Для получения ключа необходимо открыть профиль пользователя (меню на аватарке пользователя) и перейти в раздел "Ключи".
При необходимости сбросить ключ на новое значение используйте соответствующую кнопку:
# curl -X POST -H "Devprom-Auth-Key: a806f6e2af139ea856db981c20278865" -H "Content-Type:application/json" https://demo.myalm.ru/pm/support/api/v1/issues -d '{"Caption":"test123"}'
Под Windows:
# curl -X POST -H "Devprom-Auth-Key: a806f6e2af139ea856db981c20278865" -H "Content-Type:application/json" https://demo.myalm.ru/pm/support/api/v1/issues -d "{\"Caption\":\"test123\"}"
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/requirement/items -d @reqs-doc.json
Содержимое reqs-doc.json:
{
"Caption":"Requirements document",
"IsDocument":1
}
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/requirement/items -d @chapter-doc.json
Содержимое chapter-doc.json:
{
"Caption":"Chapter requirement",
"Content":"Requirement content",
"ParentPage":{
"Id":Requirement.Id
}
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/requirement/items -d @reqs.json
Содержимое reqs.json:
{
"Caption":"Requirement",
"Content":"Description",
"PageType":{
"Id":RequirementType.Id
}
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/requirement/items -d @reqs.json
Содержимое reqs.json:
{
"Caption":"Requirement",
"Content":"<p><img alt=\"\" src=\"data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQEAeAB4AAD\/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD\/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz\/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz\/wAARCAAyADIDASIAAhEBAxEB\/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL\/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6\/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL\/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6\/9oADAMBAAIRAxEAPwD92Phx8WPDPxh8PSap4V17SfEGnw3MllLPYXSTrBcRHbLA+0nZKh4aNsMp4IBrpK+Uf21fhjq37NfjKb9pD4ZWNx\/behwxn4i+H7LasfjzQYQfMdoiVVtRs490lvPlZCivCxdGWOvpTwH440n4meC9J8RaDfQ6pouuWcOo6feRZ8u6t5UDxyLkA4ZWB5557Vy0azc3SqK0l+K7r9ez9U3x4fEOVSVGorSWvk09mvya6Pyab2qKM4orqOwKKKCcGgAopvmr\/eFFADZYw0bZCkEYIPQivwZ0T\/go58Uv+CT\/AMd\/iN8JPA194d8RfD3wr4p1C20nR9bt5LuHTYTcuwSGWN45I2KkB1LNGJPMYJuZi37gfGv4r6Z8DPhD4o8aaw2NL8KaVc6tdAHDOkMbSFV\/2m27QOpJAAJNfy1eMPGWpfELxfq3iDWrhbrWvEN9Pql\/OBt8+4nkaWZwPd3Y\/jX53x5mk8IqDw8nGpd6rtpdPum7fcflPidnFXArDvCzcat5O6\/l0un3Tdvu8j9V\/h\/\/AMHPqFIYvFnwdkjZVxJc6P4jEnmH1EMsC7R7GVq9Ktf+Dmf4LtbL5\/gT4uRy4+ZY7HTJEB9mN8pP5CvxMZwg+YhfrTVuY2MirIreUnmPg52LkDcfQZIGT618dR46zeOjkpesV+lj4DD+JWfRVudS9Yr9LH6t\/H7\/AIObdQu4GtfhX8NYbJjgjUfFlwZiBnlfsls6jOOjfaOD\/Ca+Rfjd\/wAFjfj98edHtdP13xhYwadaana6slpY6Tb20cs9tMs8CuQpaSNZY0fy2YqxUbt2K+Xbuf7JaSSd40LAeuBX9IH7If8AwS3+Dv7K3wotdFs\/Cfh3xZqlxAp1TxBq+mw3l3q8hUbmy4cRwkjKwoQijn5mLO3pZTWzrPpz\/wBo5Ixte2i12Vla+3Vnr5HiOIeJ6tRfWnThC17aLW9lZWvs73Z8p+EP+DjnR7vwnpc2sfDPVJNWktInvWstWjW1acoDIYg6lhHuztDEkDGSTRX6SaZ8OvD+i6bb2dnoOj2lnaRLDBBDYxRxwxqAFRVC4VQAAAOABRX36y\/N0rfW1\/4Aj9SjluepJPGr\/wAFr\/M\/Pn\/gtX4i8U\/tP\/tDfCH9lPwfqkOkSfEIvruuzTbvLa1hMrw7wCPMSMWd5OYuN8lvb4ZSM1yP\/BRX\/gmX8Pf2Hf8Agk14qi8HeH11nxFDfaXPrPie+hWbVJ1+2xKzK3\/LGEFlURQ4UKSW3EvIfvbx1+xl4H+IP7Vfgv4zX9rfL468CWVxp+n3MN0Uhlgljnj2TR8htgurgrjHMrZ3YUL6N4s8J6b488M6jousWNrqek6xbS2V9Z3MQlgu4JUKSRSKeGVlLKQeoJFFfIViJYipXs5zTjF78seVJWXTW7dt+4sRwzHFTxVbE2c6icYS35YcqSsns73btufIf\/BLr\/gmn8Lfg3+yZ4N1XUPC\/hHxl4s8VaVb65qOu3unw37M1zEsqw27yB9sEaMqLs2iQqZCNzmvrbw94A0PwlpU1jpejaTpthcA+bbWlnHBDLkYO5VAByOOR0ryX9if9iiH9h\/w9rnhvQ\/GvijxB4IursXWhaJrLRzf8IyGLtNFBMFDtG7Mp2vwpQty8kjv7oRkV6mW4OFDDwpqCi0rWWu3n1v9\/c9nKMDTw2Fp01TUHFWsrPbTfrfe71fXU\/JP9jz\/AII8eA\/jR8A\/2hvhr4is4LPxz4N+I17pPh7xIIgl5p9vFY20ljIyqRvtpVmZ5ISdrBsja6RyJ9nf8Eovj3qHxa\/ZYtPDPii3fT\/iH8I7lvA3iqxkkEkiXVkBGk27P7xZYhG\/mL8jSCUKSFzXr3gH9nPw78Nfjb4+8faX\/aMeufEoaadbjlumktXksYGt4ZI4z\/q3MJRXwcMIkOMgkweF\/wBmDwt4K\/aK8UfFHS49QsfE3jTTrXTtcWK6ZbPUha5EE8kP3TOkZ8tZOojyB1YngwGURwkoSoJLeMvON24v1X5Nq+iPNyzIY4GdOeHio2vGXnG7cX5yWnybV9Eej0UUV759MFFFFABRRRQAUUUUAFFFFAH\/2Q==\"><\/p>"
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/wikipagefile/items -d @wikipagefile.json
Содержимое wikipagefile.json:
{
"ContentExt":"test.txt",
"WikiPage":{
"Id":Requirement.Id
},
"Content":"VGVzdA=="
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/request/items -d @request.json
Содержимое request.json:
{
"Caption":"Request",
"Content":"Description",
"Type":{
"Id":RequestType.Id
}
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/attachment/items -d @attachment.json
Содержимое attachment.json:
{
"FileExt":"test.txt",
"ObjectId":Request.Id,
"ObjectClass":"Request",
"File":"VGVzdA=="
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/task/items -d @task.json
Содержимое task.json:
{
"Assignee":{
"Login":User.Login
},
"TaskType":{
"ReferenceName":TaskType.ReferenceName
},
"Caption":"Task"
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/task/items -d @task.json
Содержимое task.json:
{
"TaskType":{
"ReferenceName":TaskType.ReferenceName
},
"ChangeRequest":{
"Id":Request.Id
},
"Caption":"Task"
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/activity/items -d @activity.json
Содержимое activity.json:
{
"Task":{
"Id":Task.Id
},
"Participant":{
"Login":User.Login
},
"Capacity":5.0
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/attachment/items -d @attachment.json
Содержимое attachment.json:
{
"FileExt":"test.txt",
"ObjectId":Task.Id,
"ObjectClass":"Task",
"File":"VGVzdA=="
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/testscenario/items -d @test-plan.json
Содержимое test-plan.json:
{
"Caption":"Test-plan",
"IsDocument":1
}
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/testscenario/items -d @testscenario.json
Содержимое testscenario.json:
{
"Caption":"Test scenario",
"Content":"Scenario content",
"ParentPage":{
"Id":"Testscenario.Id"
},
"PageType":{
"ReferenceName":"section"
}
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/wikipagefile/items -d @wikipagefile.json
Содержимое wikipagefile.json:
{
"ContentExt":"test.txt",
"WikiPage":{
"Id":Testscenario.Id
},
"Content":"VGVzdA=="
}
где:
curl -X POST -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/testexecution/items -d @testexecution.json
Содержимое testexecution.json:
{
"TestScenario":{
"Id":Testscenario.Id
},
"Caption":"Test execution"
}
где:
В результате создания тестового отчета для указанного Testscenario.Id и всех его дочерних страниц будет автоматически созданы сущности - позиция теста (TestCaseExecution)
curl -X PUT -H "Devprom-Auth-Key:f14acb09aa3b63cd8608fdf4ccb6d355" -H "Content-Type:application/json" http://devprom.local/pm/clementine/api/latest/testcaseexecution/items/id -d @caseexecution.json
где:
Содержимое caseexecution.json:
{
"Result":{
"ReferenceName":TestExecutionResult.ReferenceName
}
}
где:
Если вы хотите отправлять заявки пользователей при помощи собственной Web-формы, то вам пригодится следующий пример, который отправляет тестовую заявку в проект поддержки. Перед использованием этого примера вам необходимо:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://code.jquery.com/jquery-1.11.3.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
dataType: 'json',
type: 'POST',
url: 'https://demo.myalm.ru/pm/support/api/latest/issues',
data: JSON.stringify({
'Caption':'Test',
'Author': 'somebody@mail.ru'
}),
headers: {
'Devprom-Auth-Key': 'a806f6e2af139ea856db981c20278865',
},
success: function(data) {
$('body').append('div').html('Issue id = ' + data.Id);
}
});
});
</script>
</body>
</html>
<?php
$appUrl = 'https://demo.myalm.ru';
$projectCode = 'kanban';
$authKey = '974ccef5dd367cc448b8c1d1a9bdb2fd';
$curl = curl_init();
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
curl_setopt($curl, CURLOPT_HTTPHEADER,
array(
"Content-Type: application/json",
"Devprom-Auth-Key: ".$authKey
)
);
// get all issues
curl_setopt($curl, CURLOPT_URL, $appUrl.'/pm/'.$projectCode.'/api/latest/issues');
curl_setopt($curl, CURLOPT_HTTPGET, true);
$result = curl_exec($curl);
var_export(json_decode($result, true));
// create a new issue
curl_setopt($curl, CURLOPT_URL, $appUrl.'/pm/'.$projectCode.'/api/latest/issues');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPGET, false);
curl_setopt($curl, CURLOPT_POSTFIELDS,
json_encode(
array(
'Caption' => 'Issue title',
'Description' => 'Issue description'
)
)
);
$result = curl_exec($curl);
var_export(json_decode($result, true));
curl_close($curl);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
class DevpromRestService
{
public void updateIssue()
{
// Получим список пожеланий в проекте
List<Issue> wasIssues = new JavaScriptSerializer().Deserialize<List<Issue>>(
makeRequest("GET", "issues")
);
// Создаем новое пожелание
Issue newIssue = new JavaScriptSerializer().Deserialize<Issue>(
makeRequest("POST", "issues", new JavaScriptSerializer().Serialize(
new Issue
{
Caption = "Название нового пожелания",
Description = "Описание нового пожелания",
Priority = "2"
}
))
);
// Редактируем ранее созданное пожелание
makeRequest("PUT", "issues/" + newIssue.Id, new JavaScriptSerializer().Serialize(
new Issue
{
Description = "Изменненное название пожелания",
Priority = "1"
}
));
// Удалим созданное пожелание
makeRequest("DELETE", "issues/" + newIssue.Id);
}
public string makeRequest(string method, string route, string data = "")
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(
TestHelper.appHostUrl + "/pm/<project-code>/api/v1/" + route
);
request.Method = method;
request.ContentLength = 0;
request.ContentType = "application/json";
request.Headers.Add(
"Authorization",
"Basic " + Convert.ToBase64String(
Encoding.ASCII.GetBytes(
<логин-пользователя> + ":" + <пароль-пользователя>
)
)
);
var bytes = Encoding.GetEncoding("windows-1251").GetBytes(data);
request.ContentLength = bytes.Length;
if (!String.IsNullOrEmpty(data))
{
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
if (response.StatusCode != HttpStatusCode.OK)
{
throw new ApplicationException(
String.Format("Request failed. Received HTTP {0}", response.StatusCode)
);
}
return (new StreamReader(response.GetResponseStream(), Encoding.UTF8)).ReadToEnd();
}
}
Для создания проекта программным путем необходимо отправить POST запрос:
curl -H "Content-Type: application/x-www-form-urlencoded" -X POST -d "Caption=Test1&CodeName=test1&Template=44&DemoData=N" http://<адрес_сервера>/projects/new?appkey=<ключ>
Название параметра | Назначение параметра |
---|---|
Caption | Название проекта |
CodeName | Кодовое имя проекта, используемое в адресной строке ссылок на проектные артефакты |
Template | Идентификатор процесса, который должен быть использован для создания проекта |
DemoData | N - не использовать демонстрационные данные |
appkey | Ключ для аутентификации, который можно получить на странице профиля участника (Ключи - Авторизация по URL), от имени которого будет создаваться проект. Данный пользователь автоматически становится координатором (руководителем) проекта. |